Субдомены CakePHP с htaccess
Я использовал следующие правила в файле htaccess в других приложениях, чтобы перенаправить пользователей из папки в поддомен, но загружать содержимое из этой папки при доступе к этому поддомену.
# REWRITE SUBDOMAIN TO FOLDER
RewriteCond %{HTTP_HOST} ^admin\.cameron\.com$
RewriteRule !^admin/? admin%{REQUEST_URI} [NC,L]
# REWRITE FOLDER TO SUBDOMAIN
RewriteCond %{THE_REQUEST} \s/admin/([^\s]*) [NC]
RewriteRule ^ http://admin.cameron.com/%1 [R=301,L]
Итак, если я перехожу к: http://cameron.com/admin
Я заканчиваю на http://admin.cameron.com/
Но содержимое загружается из http://cameron.com/admin
Однако это не работает для CakePHP 2.x из-за его переписывания, по-видимому...
В моем файле htaccess в /app/webroot
у меня есть:
<IfModule mod_rewrite.c>
RewriteEngine On
# CAKEPHP RULES
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
# REWRITE SUBDOMAIN TO FOLDER
RewriteCond %{HTTP_HOST} ^admin\.cameron\.com$
RewriteRule !^admin/? admin%{REQUEST_URI} [NC,L]
# REWRITE FOLDER TO SUBDOMAIN
RewriteCond %{THE_REQUEST} \s/admin/([^\s]*) [NC]
RewriteRule ^ http://admin.cameron.com/%1 [R=301,L]
</IfModule>
Если я перехожу к: http://cameron.com/admin
, он просто пытается загрузить AdminController и не перенаправляет вас, и если я перейду к: http://admin.cameron.com/
, я просто получу 500 Внутреннюю ошибку сервера.
Любые идеи о том, как заставить это работать на CakePHP?
Ответы
Ответ 1
CakePHP и почти любая другая инфраструктура PHP анализируют $_SERVER ['REQUEST_URI'], чтобы перенаправить ваш запрос на конкретный контроллер
подробнее здесь: https://github.com/cakephp/cakephp/blob/2.6/lib/Cake/Network/CakeRequest.php#L230,
поэтому вам просто нужно, чтобы параметры URI запроса SAME для вашего перенаправления получили приложение.
Для вашего старого местоположения это было "/admin", для нового местоположения оно должно быть одинаковым, но вы не хотите его передавать, поэтому лучше изменить задачу следующим образом:
"Когда вы перейдете на admin.site.com, вы будете перенаправлены на сайт .com/admin".
Это можно сделать так:
RewriteRule ^([^.]+)\.example\.com http://example.com/$1
Это не рабочий пример правила, потому что вам также нужно переписать URI субдоменного запроса, чтобы все работало, и оно зависит от ваших требований, но может быть как-то так:
RewriteRule ^([^.]+)\.example\.com(.*) http://example.com/$1/$2
UPD: реальный пример
$ cat app/webroot/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
RewriteCond %{HTTP_HOST} ^admin.example.com
RewriteRule ^(.*)$ http://example.com/admin/$1 [P,L,NC]
</IfModule>
Ответ 2
<IfModule mod_rewrite.c>
#standard cake htaccess stuff
...
RewriteCond %{HTTP_HOST} ^profile\.thechatfun\.com$ [NC]
RewriteRule ^(.*)$ http://www.thechatfun.com/users/profile/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^chat\.thechatfun\.com$ [NC]
RewriteRule ^(.*)$ http://www.thechatfun.com/chats/index/$1 [R=301,L]
</IfModule>