Я создал поддомен подстановки * .domain.com, и я использую следующий .htaccess:
Options +FollowSymLinks RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !www\. RewriteCond %{HTTP_HOST} (.*)\.domain\.com RewriteRule .* index.php?username=%1 [L]
Все работает отлично.
Я хочу реализовать этот метод в laravel. В основном я хочу, чтобы мой профиль пользователя отображался, когда вы переходите к username.domain.com. Любые идеи по достижению этого?
Это легко. Во-первых – НЕ меняйте файл .htaccess
по умолчанию, предоставленный Laravel. По умолчанию все запросы в ваш домен будут перенаправлены в ваш файл index.php
, что мы и хотим.
Затем в файле routes.php
просто используйте фильтр «before», который фильтрует все запросы к вашему приложению до того, как что-либо еще будет сделано.
Route::filter('before', function() { // Check if we asked for a user $server = explode('.', Request::server('HTTP_HOST')); if (count($server) == 3) { // We have 3 parts of the domain - therefore a subdomain was requested // ie user.domain.com // Check if user is valid and has access - ie is logged in if (Auth::user()->username === $server[0]) { // User is logged in, and has access to this subdomain // DO WHATEVER YOU WANT HERE WITH THE USER PROFILE echo "your username is ".$server[0]; } else { // Username is invalid, or user does not have access to this subdomain // SHOW ERROR OR WHATEVER YOU WANT echo "error - you do not have access to here"; } } else { // Only 2 parts of domain was requested - therefore no subdomain was requested // ie domain.com // Do nothing here - will just route normally - but you could put logic here if you want } });
edit: если у вас есть расширение страны (например, domain.com.au или domain.com.eu), тогда вы захотите изменить счетчик ($ server), чтобы проверить на 4, а не на 3
Laravel 4 имеет эту функциональность из коробки:
Route::group(array('domain' => '{account}.myapp.com'), function() { Route::get('user/{id}', function($account, $id) { // ... }); });
Источник
Хотя я не могу сказать, какое полное решение будет в вашем случае, я бы начал с значения SERVER_NAME из запроса (PHP: $ _SERVER ['SERVER_NAME']), например:
$username = str_replace('.domain.com', '', Request::server('SERVER_NAME'));
Удостоверьтесь, что вы дополнительно очистите / дезинфицируете имя пользователя, и оттуда вы можете найти пользователя из имени пользователя. Что-то вроде:
$user = User::where('username', '=', $username)->first();
Где-то в файле маршрутов вы можете условно определить маршрут, если SERVER_NAME не является http://www.domain.com или domain.com, хотя я уверен, что другие могут придумать гораздо более красноречивый способ для этой части …
способность добавлять субдомены, такие как субдомен *. domain.com должен быть включен вашим хостинг-провайдером, в .htaccess вы не можете настроить поддержку поддоменов