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.
non c'è bisogno di toccare i percorsi onestamente. –