CakePHP htaccess删除www

时间:2012-06-28 05:44:53

标签: apache .htaccess cakephp cakephp-2.0 no-www

我知道htaccess重定向存在太多问题,但我找不到确切的解决方案。如果存在匹配的问题,我很抱歉。

在我的公共html(webroot)文件夹中有以下htaccess文件:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

然后,为了将带有“www”的网址重定向到“非www”,我添加了两行。文件变成这样:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

</IfModule>

所以问题是, www.example.com 重定向到 example.com 但是 www.example.com/mycontroller / 未重定向到 example.com/mycontroller /

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

第一个RewriteRule会将没有实际物理文件/文件夹的每个URL重写到index.php页面,但是如果匹配,它会将此视为最后一条规则并停止处理所有其他规则( [L]旗帜)。因此,当您仅使用根路径进行呼叫时,它不会被触发并继续执行您的www重写规则,但任何其他逻辑URL都会触发第一次重写并停止。

只需更改规则的顺序,将RewriteCond / RewriteRule对放在默认值之前。

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]


</IfModule>

如果您将其作为虚拟主机运行并且可以访问Apache的配置文件,请考虑将规则放在Apache的虚拟主机配置文件中,以避免在更新Cake版本时被覆盖,或者确保以其他方式保护您的更改。