На моем сайте пользователи имеют общедоступные профили, к которым можно получить доступ через http://mysite.com/vanity_url
. Я хочу разрешить пользователям указывать свои собственные домены на странице своего профиля на моем сайте. Just like Bandcamp does.Какой самый элегантный способ обработки пользовательских доменов?
Модель Profile
имеет следующие два поля: vanity_url
, что является обычным полем типа имени пользователя; и новый custom_domain
, который является их собственным доменным именем, например, example.com
.
Это то, что я сделал до сих пор, но я боюсь, что это не самый элегантный, безопасный и эффективный способ сделать это.
Во-первых, я убедился, что DocumentRoot
для Apache установлен в каталог моего приложения webroot
, поэтому я могу указать пользователям указать их DNS на IP-адрес моего сайта.
Теперь это как правила маршрутизации на моем routes.php
выглядеть следующим образом:
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');
}
И это, как view
действие на ProfilesController
выглядит следующим образом:
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'));
}
Какие проблемы я мог бы столкнуться с таким подходом?
Кроме того, кто-нибудь знает, почему Bandcamp просит пользователей создать
CNAME вместо
A запись о создании поддомена? Я что-то упускаю из виду?
Редактировать Кто-то помогло мне понять, что последний бит из: Кажется, вы не можете легко использовать запись CNAME, чтобы указать голый домен к другому. Главный вопрос по-прежнему остается открытым.
вам не нужно трогать ваши маршруты честно. –