在网站根目录和子目录中使用.htaccess中的mod_rewrite

时间:2008-12-03 22:25:58

标签: apache .htaccess mod-rewrite

我的困境:

在我网站的根目录中的.htaccess:

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

在子目录/ foo中的.htaccess

RewriteEngine On
RewriteRule ^page1\.html$ /foo/page2.html [R=301]

首先,我试图确保所有请求都包含起始www。 在第二个中,我将foo子目录中page1.html的请求重定向到page2.html,也在该子目录中。

在我的浏览器中,尝试访问:

http://www.example.com/foo/page2.html< ==有效,

http://www.example.com/foo/page1.html< ==重定向到http://www.example.com/foo/page2.html,好

http://example.com/foo/page1.html< ==重定向到http://www.example.com/foo/page2.html,好

http://example.com/foo/page2.html< ==没有重定向,不好

==>应重定向到:http://**www.**example.com/foo/page2.html

通过试验,网站根目录中.htaccess文件中的重定向规则似乎只对该子目录 IF 中的页面请求生效,该子目录不包含.htaccess文件,或者它确实并指定了一个对这个特定请求生效的重写规则。

有谁能看到我做错了什么?我怎样才能获得坚持www的重写规则。如果http://example.com/foo/page2.html无法触发它?


谢谢你跳,这很有用!

为了记录,我必须将站点根目录中的重写规则更改为:

RewriteRule ^.*$ http://www.example.com%{REQUEST_URI} [R=301,L]

哪个好。谢谢!

2 个答案:

答案 0 :(得分:4)

您在foo/.htaccess中缺少以下指令:

RewriteOptions inherit

比照the documentation

答案 1 :(得分:2)

我不确定为什么/.htaccess中的规则不适用于/foo/.htaccess的具体细节。通常,.htaccess文件将继承目录结构中的规则,这可能导致各种奇怪的事情。但是,对于您的特定解决方案,您可以将所有相关规则放在父.htaccess文件中:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
RewriteRule ^foo/page1\.html$ /foo/page2.html [R=301]