如果我有重写规则:
RewriteRule ([^?]*) /script.php?path=$1 [L,QSA]
除非我也有以下条件,否则它将返回 500 内部错误:
RewriteCond %{REQUEST_FILENAME} !-f
为什么是这样?我的印象是这些条件实际上并没有改变规则的工作方式,而是它们只是规则的例外。
如果我有重写规则:
RewriteRule ([^?]*) /script.php?path=$1 [L,QSA]
除非我也有以下条件,否则它将返回 500 内部错误:
RewriteCond %{REQUEST_FILENAME} !-f
为什么是这样?我的印象是这些条件实际上并没有改变规则的工作方式,而是它们只是规则的例外。
测试-f给定参数是否为文件以及它是否存在(它的大小可能为 0 字节)。您收到 500 内部服务器错误的原因是重写引擎循环遍历所有规则,直到 URI 停止更改。例如,如果你只有这个:
RewriteRule ([^?]*) /script.php?path=$1 [L,QSA]
并且请求进来,因为/foobarURI 是“foobar”
([^?]*),URI 被重写为 "/script.php?path=foobar"([^?]*),URI 被重写为 "/script.php?path=script"现在,如果您添加条件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^?]*) /script.php?path=$1 [L,QSA]
请求进来/foobar的 URI 是“foobar”
!-f是真的([^?]*),URI 被重写为 "/script.php?path=foobar"!-f是假的这是你的规则:
RewriteRule ([^?]*) /script.php?path=$1 [L,QSA]
这里([^?]*)匹配 0 或更多长度的任何内容,但?. 然后将其重写为/script.phpURI。再次注入生成的 URI 以进行评估。请注意,([^?]*)它将再次匹配,因为它有 0 个或多个non-?并且再次应用规则。这个循环一直持续到 mod_rewrite 用完递归限制(默认 = 10)。
现在当你有
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^?]*) /script.php?path=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-fRewriteRule表示如果请求不是针对有效文件,则应用下一个。
现在,在第一次重写之后,目标 URI/script.php是一个有效的文件,RewriteCond这次失败,并且不再应用规则。
PS:此匹配模式([^?]*)将始终匹配所有 URI 模式,因为 REQUEST_URI 永远不能包含?
您的规则相当于:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /script.php?path=$1 [L,QSA]