给定以下 Apache 重写规则:
RewriteRule .* foo
...我如何准确找出 .* 正在测试的字符串?假设在此之前可以应用任意数量的任意重写规则,并且我无法知道它们是什么(假设 httpd.conf 对我隐藏)。
编辑:谢谢,但请记住,我无权编辑(甚至阅读!)httpd.conf。我只有 .htaccess 文件可供使用。
给定以下 Apache 重写规则:
RewriteRule .* foo
...我如何准确找出 .* 正在测试的字符串?假设在此之前可以应用任意数量的任意重写规则,并且我无法知道它们是什么(假设 httpd.conf 对我隐藏)。
编辑:谢谢,但请记住,我无权编辑(甚至阅读!)httpd.conf。我只有 .htaccess 文件可供使用。
编辑:删除需要 httpd.conf 访问的解决方案
这将起作用,只需在重写规则之前将其放在行上:
然后在 .ssi 或 .cgi 文件中,输出该变量。
尝试查看其他变量不一定会告诉您您的规则与什么匹配;他们会告诉您在任何重写规则运行之前匹配的内容或在所有重写规则运行之后的情况。
mod_rewrite使用正则表达式来识别特定的字符串,然后用给定的替换重写匹配的字符串。在您的示例中:
mod_rewrite 将匹配任何字符(这就是“.”所代表的),它重复的次数与它重复的次数一样多(因此是“*”)。现在,由于“*”重复了“.”,这意味着它将匹配具有任意组合和长度的任意字符的任意字符串。然后,它将用“foo”替换那个大而长的any。
所以要使用mod_rewrite,你至少需要对正则表达式有一个基本的了解,以及对你要匹配和重写的内容有充分的了解。
我经常使用Reggy或Kiki之类的小程序来帮助我布置正则表达式。您可能会发现这也很有帮助。
我希望这有帮助。
如果您有权访问 httpd.conf,则此答案描述了如何打开 mod_rewrite 的日志记录,这将为您提供所需的内容。
如果您有权访问正在服务的文件系统中的.htaccess文件,则可以在那里进行配置更改以激活日志记录。
否则,反复试验可能是您最好的选择!
我知道这是 IIS 中的标头,我不了解 Apache,但是如果您在服务器端脚本(ASP/PHP/whatever)中查询,标头 UNENCODED_URL 或 HTTP_URL 可能会为您提供服务器端 URL。
然后,您可以使用它来回溯 .htaccess 中的规则