0

我知道 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”的 URL 重定向到“非 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.comwww.example.com/mycontroller/没有重定向到example.com/mycontroller/

我该如何解决这个问题?

4

1 回答 1

6

第一个 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 的虚拟主机 conf 文件中以避免在更新 Cake 版本时被覆盖,或者确保以其他方式保护您的更改。

于 2012-06-28T09:24:59.443 回答