在我的域根目录中的主.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/
版本。我究竟做错了什么?请帮助...如有必要,我可以提供更好的解释/示例。
答案 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]