在我的服务器上,我有一个包含以下内容的 .htaccess 文件:
RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteRule ^default/.*$ /index.php?id=12345 [L]
RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteCond %{REQUEST_URI} ^/?$
RewriteRule ^(.*)$ http://myhost.local/default/home [R=302,NC]
现象是,当请求http://myhost.local/时,我没有像预期的那样被 302 重定向到http://myhost.local/default/home ,而是被 301(!)重定向回http://myhost .local/,导致无限循环。
另一个奇怪的事情是它^/$
似乎永远不会匹配我的 URL,即使它应该匹配,所以^/?
出于某种原因我不得不使用问号。每当没有匹配时,就不会发生重写,因此没有无限循环,因此这进一步证明如果满足条件,我RewriteRule
的 for^(.*)$
确实会被选中,只有我想要重定向到的内容以及完全忽略的代码。
作为记录,我也有这种格式的规则:
RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteRule ^default/.*$ /index.php?id=12345 [L]
RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteRule ^/?$ http://myhost.local/default/home [R=302,NC]
结果与第一个示例完全相同。
是什么导致重定向发生,但不是我实际提供的 URL?
注意事项:
- 此 .htaccess 文件中还有其他条目
- 此 .htaccess 文件位于 DOCUMENT_ROOT 中
- 默认的 VirtualHost 已
RewriteOptions inherit
设置