给定以下 Apache 重写规则:
RewriteRule .* foo
...我如何知道恰恰.* 测试的是哪个字符串?假设在此之前可以应用任意数量的重写规则,而我无法知道它们是什么(假设 httpd.conf 对我隐藏了)。
编辑:谢谢,不过请记住,我确实不是有权编辑(甚至读取!)httpd.conf。我只能使用 .htaccess 文件。
答案1
编辑:删除了需要 httpd.conf 访问的解决方案
这将起作用,只需将其放在重写规则之前的行上:
RewriteRule (.*) - [ENV=MYREWRITERULETEST:$1]
然后在 .ssi 或 .cgi 文件中输出该变量。
尝试查看其他变量不一定会告诉您您的规则与什么匹配;它们会告诉您在运行任何重写规则之前匹配的内容,或者运行所有重写规则之后情况是什么样的。
答案2
mod_rewrite用途常用表达识别特定字符串,然后重写与给定替换匹配的字符串。 在您的示例中:
RewriteRule .* foo
mod_rewrite 将匹配任何字符(这就是“.”所代表的意思),只要它重复多次(因此是“*”)。现在,由于“*”重复“。”,这意味着它将匹配任何包含任何字符的字符串,这些字符可以是任何组合和长度。然后,它将用“foo”替换那个又大又长的任意字符。
因此,要使用 mod_rewrite,您至少需要对正则表达式有基本的了解,以及完全理解您想要匹配和重写的内容。
我经常使用像这样的小程序雷吉或者琪琪帮助我布局正则表达式。您可能也会发现这很有用。
我希望这有帮助。
答案3
答案4
我知道这是 IIS 中的一个标头,我不知道 Apache,但是如果您在服务器端脚本(ASP/PHP/whatever)中查询它,标头 UNENCODED_URL 或 HTTP_URL 可能会为您提供服务器端 URL。
然后,您可以使用它在 .htaccess 中回溯规则