2012-01-20 14 views
5

Sul mio sito, gli utenti hanno profili pubblici cui si può accedere tramite http://mysite.com/vanity_url. Voglio consentire agli utenti di indirizzare i propri domini alla pagina del profilo sul mio sito. Just like Bandcamp does.Qual è il modo più elegante per gestire gli utenti personalizzato domini?

Il mio modello Profile dispone di questi due campi per risolvere questo: vanity_url, che è il tipo di campo nome utente normale; e un nuovo custom_domain che è il nome i propri domini, ad esempio, example.com.

Questo è quello che ho fatto finora, ma ho paura che potrebbe non essere il modo più elegante, sicura ed efficiente per farlo.

In primo luogo, ho fatto in modo di Apache DocumentRoot è impostata sulla directory del mio app webroot, quindi posso dire agli utenti di indicare il loro DNS per IP del mio sito.

Ora, questo è come le regole di routing sul mio routes.php assomigliare:

if (preg_match('/mysite\.com\.?$/', $_SERVER['SERVER_NAME'])){ 
    // Normal routes when visitors go to my domain 
    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); 
    Router::connect('/pages/**', array('controller' => 'pages', 'action' => 'display')); 

    // Move all other actions to a separate '/app/' area 
    Router::connect('/app/:controller/:action/**'); 
    Router::connect('/app/:controller/**'); 

    // Handle profile URLs 
    Router::connect('/:profile/**', 
     array('controller' => 'profiles', 'action' => 'view'), 
     array('pass' => array('profile'), 'profile' => '[0-9a-zA-Z\-\_]+') 
    ); 
} 
else{ 
    // If visitors come via a URL different to mysite.com, I let 
    // the ProfilesController deal with it passing the current SERVER_NAME 
    // as a param to the 'view' action 
    Router::connect('/', array(
     'controller' => 'profiles', 
     'action' => 'view', 
     $_SERVER['SERVER_NAME'], // 'url' param 
     true // 'customDomain' param 
    )); 
    Router::redirect('/*', 'http://mysite.com'); 
} 

e questo è come l'azione view sul ProfilesController assomiglia:

public function view($url = null, $customDomain = false) { 
    if ($url){ 
     // Find the profile by its vanity_url or its custom_domain 
     $findOptions = array(
      'conditions' => $customDomain? 
       array('custom_domain' => $url) : 
       array('vanity_url' => $url) 
     ); 
     if ($profile = $this->Profile->find('first', $findOptions)) { 
      $this->set('profile', $profile); 
     } 
    } 
    else throw new NotFoundException(__('Invalid profile')); 
} 

Quali problemi potrei affrontare con questo approccio?

Inoltre, qualcuno sa perché Bandcamp chiede agli utenti di creare un CNAME invece di un A record a configurare un sottodominio? Mi sto perdendo qualcosa che dovrei considerare qui?

Modifica Qualcuno mi ha aiutato a capire che la scorsa po 'fuori: Sembra che non si può facilmente utilizzare un record CNAME per puntare un dominio semplice a un altro. La domanda principale è ancora aperta.

+0

non c'è bisogno di toccare i percorsi onestamente. –

risposta

1

ho fatto qualcosa di simile con la torta 1.3 di un anno fa

Ci sono 4 passi importanti in questa soluzione:

  1. dispone di un modello di dominio e di domini DataTable che registra tutti i possibili domini personalizzati e viste per agli utenti di inserire i propri domini personalizzati
  2. creare dominio controllando il codice in beforeFilter in AppController e salvare i dati utente per sessione
  3. l'azione di controllo che è responsabile per la visualizzazione del profilo pubblico deve riferimento in modo corretto gli stessi dati utente che viene salvato a Sessione
  4. gli utenti hanno bisogno di messa a punto record CNAME e A con i loro registrar di domini

Passo modello 1 Dominio e DataTable

Quello che ho fatto ero io aveva una tabella chiamata domini

Ogni dominio contiene l'indirizzo web che io pensavo di essere solo un http: // ....

Dominio belongsTo utente

utente hasMany Domain

domains 
========== 
id web_address user_id main 

il principale è un tinyint che indica se questo è l'url principale da utilizzare in quanto l'utente hasMany dominio.

quindi ciò che accade è che l'utente deve creare un nuovo record o più per Dominio.

Fase 2 Codice in beforeFilter di AppController per capire quale profilo pubblico per visualizzare Avanti, il codice deve essere in grado di recuperare l'ID utente in base alla url presentato ad ogni richiesta HTTP.

L'utente da questo punto in poi si riferisce all'utente il cui profilo pubblico è visualizzato. NON confondere questo con l'utente registrato, se ne hai uno.

Suggerisco di farlo nel proprio beforeFilter di AppController.

Qualcosa di simile

$currentUser = $this->User->getByDomain(FULL_BASE_URL); 
    $this->Session->write('CurrentUser', $currentUser); 

Il codice per getByDomain per il modello d'uso è anche un esercizio per voi. Dovrebbe essere abbastanza facile dato che ho spiegato lo schema per domini

Potrebbe essere necessario verificare l'utente corrente all'interno dei dati della sessione prima di scrivere l'utente corrente perché non si desidera scrivere i dati della sessione tutto il tempo soprattutto quando il visitatore sta visitando la stessa pagina Web ancora e ancora.

Potrebbe essere necessario modificare il frammento di codice qui sopra per qualcosa di simile a questo:

$currentUser = $this->Session->read('CurrentUser'); 

    if(empty($currentUser) OR (!$this->checkUrlAgainstDomain(FULL_BASE_URL, $currentUser['Domain']['domain']))) { 
     $currentUser = $this->User->getByDomain(FULL_BASE_URL); 
        $this->Session->write('CurrentUser', $currentUser); 
    } 

Anche in questo caso la funzione checkUrlAgainstDomain è un esercizio per voi.

Fase 3 Codice in beforeFilter di AppController per capire quale profilo pubblico per visualizzare Si utilizzerà i dati CurrentUser salvati nella sessione per determinare quale pagina pubblica per l'utente che si desidera visualizzare.

lascio questo come un esercizio per voi di capire nella vostra UsersController sotto azione della vista

Passo 4 gli utenti devono inserire la seguente nei loro registrar di domini Poi gli utenti hanno bisogno di andare al loro dominio registrar e fare una cosa simile agli utenti BandCamp nelle faq a cui ti sei collegato.

  • sottodominio "www" per l'utente dovrebbe puntare usando CNAME per example.Lucho.com

  • dominio principale per l'utente (senza www) dovrebbe avere un record A che punta a Indirizzo IP del server in cui cioè la tua Lucho.com risiede in

  • L'utente deve aggiungere entrambe le pagine di gestione di questi domini come spiegato in precedenza.Possono essere necessarie fino a 48 ore per il completo aggiornamento del dominio.

+0

se hai bisogno di me per fare una descrizione dell'intera cosa in dettaglio, lo farò. Fammelo sapere. Ho lasciato alcune parti nella mia risposta qui. Le parti che ho tralasciato penso che tu possa lavorare da solo. Ma sarò felice di scrivere il tutto con dettagli chiari. La lunghezza di una risposta super dettagliata non è l'ideale per la risposta StackOverflow –

+0

Finalmente qualcuno ha risposto! Penso che il tuo approccio sia buono, ma trovo che non sia necessario (almeno per i miei bisogni) avere una relazione MOLTA tra Utente e Dominio. I miei utenti avranno solo un dominio. Vorrei anche evitare di salvare questi dati nella sessione, potrebbe causare confusione in seguito. Tutto sommato, rimango con il mio approccio perché sembra più semplice (anche se sono sicuro che potrebbe essere ottimizzato), ma anche il tuo funziona bene e le persone che cercano qualcosa di simile su SO potrebbero trovarlo utile. Molte grazie. – luchomolina

+0

@luchomolina hai detto che la tua domanda principale è ancora aperta. Quindi qual è la tua domanda principale? –

Problemi correlati