En mi sitio, los usuarios tienen perfiles públicos a los que se puede acceder a través del http://mysite.com/vanity_url
. Quiero permitir que los usuarios dirijan sus propios dominios a su página de perfil en mi sitio. Just like Bandcamp does.¿Cuál es la forma más elegante de manejar los dominios personalizados de los usuarios?
Mi modelo Profile
tiene estos dos campos para hacer frente a esto: vanity_url
, que es el tipo de nombre de usuario normal del campo; y un nuevo custom_domain
que es el nombre de sus propios dominios, por ejemplo, example.com
.
Esto es lo que he hecho hasta ahora, pero me temo que podría no ser la forma más elegante, segura y eficiente de hacerlo.
Primero, me aseguré de que el DocumentRoot
de Apache esté configurado en el directorio webroot
de mi aplicación, por lo que puedo indicar a los usuarios que dirijan sus DNS a la dirección IP de mi sitio.
Ahora, así es como las reglas de enrutamiento en mi routes.php
aspecto:
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');
}
y es así como la acción view
en el ProfilesController
parece:
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'));
}
¿Qué problemas podría enfrentar con este enfoque?
Además, ¿alguien sabe por qué Bandcamp pide a los usuarios para crear un CNAME
en lugar de un
Un registro para configurar un subdominio? ¿Me estoy perdiendo algo que debería considerar aquí?
Editar Alguien me ayudó a que el último bit de salida: Parece que no se puede utilizar fácilmente un registro CNAME para apuntar un dominio simple a otro. La pregunta principal sigue abierta.
que no es necesario tocar sus rutas con honestidad. –