我正在使用此规则:
RewriteRule !^(.*?/.*|.*?\.(?:php|html)$)$ headers.php?a=$1 [L]
(基于Regex match this OR that?上的巨大贡献)
当我输入headers.php
时,它会重写为localhost/foo
,但a
变量为空,而不是foo
(我使用var_dump($_REQUEST)
检查了)
知道为什么吗?我尝试使用
RewriteCond %{REQUEST_URI} !headers
但事实并非如此。
谢谢!
答案 0 :(得分:2)
规则被否定,因此当且仅当正则表达式 与正在处理的URI匹配时才会执行该规则。由于捕获组与localhost/foo
不匹配,因此正则表达式引擎无法放入$1
。解决方案是避免在RewriteRule
指令中使用否定,而是使用RewriteCond
指令来检查否定的正则表达式。以下规则集应该有效。 (不过我没有测试过。有可能在某个地方出现了错误。)
RewriteCond %{REQUEST_URI} !/.*/
RewriteCond %{REQUEST_URI} !\.(html|php)$
RewriteRule (.*) headers.php?a=$1 [L]