0

在我的服务器上,我有一个包含以下内容的 .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设置
4

1 回答 1

0

罪魁祸首在同一个 .htaccess 文件中:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.+/.* http://%{HTTP_HOST}/ [R=301,L]

这也很容易解释了301。

于 2013-10-22T16:51:23.263 回答