我了解我的代码发生了什么,以及为什么我会陷入无限循环。所以我有以下内容:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^foo/?([^/]+)?/?(.+)? /foo.php?bar=$1&baz=$2 [L,NC]
</IfModule>
因此,实际发生的情况是用户进入foo
(或foo/a/b
) 并被重定向到foo.php?bar=$1&baz=$2
。但此时(我知道我需要更详细的解释,因为我确信这是设计使然).htaccess 文件正在 上重新运行foo.php?bar=$1&baz=$2
,这符合我的规则,并进入无限循环。但我不知道为什么要通过我的规则重新运行它。
我对 .htaccess 有什么不明白的吗RewriteRule
?
PS:我已经通过将以下命令放在规则之前来解决了这个直接的问题,但我想知道原因,以便我可以在将来修复该问题(这样我就可以删除这些行并做其他事情)。
RewriteCondition %{REQUEST_FILENAME} !-f
RewriteCondition %{REQUEST_FILENAME} !-d
答案1
第一个请求得到处理,URL 被重写。这会导致对新 URL 产生新请求。如果没有某种方式来过滤请求(参见 Devin 的回答),您看到的是正确的行为。
答案2
通常需要在 RewriteRule 之前使用 RewriteCond,这样才能不匹配重写的 URL 并避免无限循环。这是 RewriteCond 最常见的用途之一。您应该很高兴能弄清楚这一点,并且不会觉得以这种方式使用它有什么不对。