应用.htaccess重定向到所有子目录到www版本的站点

时间:2012-10-01 18:47:42

标签: apache .htaccess redirect subdomain

在我的域根目录中的主.htaccess文件中,我有以下代码:

RewriteEngine on
# If missing 'www'
RewriteCond %{http_host} ^example.com [nc]
# Redirect to 'www' version
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,nc]
# Remove 'index.php' from URL 
RewriteRule ^index.php$ http://www.example.com/ [R=301,nc]

然后我在每个目录中都有一个单独的.htaccess文件,同时从URL中删除index.php,如/products目录中所示:

RewriteEngine on
RewriteRule ^index.php$ http://www.example.com/products/ [r=301,nc]

当我(清除缓存后)访问example.com时,我会按预期重定向到www.example.com/

但如果我在地址栏中输入example.com/products,则页面加载为example.com/products/,我重定向到www.example.com/products/版本。我究竟做错了什么?请帮助...如有必要,我可以提供更好的解释/示例。

1 个答案:

答案 0 :(得分:1)

当您在子目录中的htaccess中打开重写引擎时,它会排除可能在其任何父目录中的htaccess文件中的所有重写规则,除非您使用:

RewriteOptions inherit
子目录中的htaccess文件中的

指令。由于/products中唯一的规则只有index.php的重定向,除非请求是/products/index.php,否则不会应用任何规则,因为忽略了父目录中的规则。 / p>

另请注意,在Apache 2.2中,inherit选项将父级的重写规则置于子目录中的规则之后。


编辑:

继承的规则不起作用,因为基数不相同。你只需要在其他地方添加重定向到www规则。所以将它们添加到/products/目录中的htaccess文件中:

RewriteCond %{http_host} ^example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/products/$1 [R=301,nc]

或者,您可以保留RewriteOptions inherit,但可以从以下位置更改文档根目录中的htaccess规则:

RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,nc]

为:

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