0

.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然后我在每个目录中都有一个单独的文件,同时index.php从 URL 中删除 ,如下所示的/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/版本。我究竟做错了什么?请帮助...如果需要,我可以提供更好的解释/示例。

4

1 回答 1

1

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

RewriteOptions inherit

子目录中的 htaccess 文件中的指令。由于您拥有的唯一规则/products只有重定向 for index.php,除非请求是 for /products/index.php,否则不会应用任何规则,因为父目录中的规则被忽略。

另请注意,在 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]
于 2012-10-01T19:22:15.517 回答