带有 htaccess 的 CakePHP 子域
Posted
技术标签:
【中文标题】带有 htaccess 的 CakePHP 子域【英文标题】:CakePHP subdomains with htaccess 【发布时间】:2015-07-12 04:27:25 【问题描述】:我在其他应用程序的 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 不起作用,因为它显然是重写...
在/app/webroot
的 htaccess 文件中,我有:
<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 上工作的任何想法?
【问题讨论】:
如果我是对的,您是否只想将 url 更改为指向子域的 url? 尝试在您的 webroot .htaccess 文件中的 RewriteEngine On 之后添加此语句 RewriteBase /app/webroot 【参考方案1】:CakePHP 和几乎任何其他 PHP 框架都会解析 $_SERVER['REQUEST_URI'] 以便将您的请求路由到特定控制器
更多信息在这里:https://github.com/cakephp/cakephp/blob/2.6/lib/Cake/Network/CakeRequest.php#L230,
因此,您只需为重定向提供相同的请求 URI 参数即可使应用正常运行。
对于您的旧位置是“/admin”,对于新位置应该是相同的,但您不想传递它,所以最好像这样更改任务:
“当您访问 admin.site.com 时,您将被重定向到 site.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>
【讨论】:
您有完整的 htaccess 示例吗?因为我的规则在与 CakePHP 一起使用之前有效,这就是问题所在。 $ 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.cake.local RewriteRule ^(.*)$ http://cake.local/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>
【讨论】:
以上是关于带有 htaccess 的 CakePHP 子域的主要内容,如果未能解决你的问题,请参考以下文章
根据 .htaccess 中的域/子域更改 DirectoryIndex