我如何知道 RewriteRule 正在测试什么?

我如何知道 RewriteRule 正在测试什么?

给定以下 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

如果你有权访问 httpd.conf,则回答描述如何打开 mod_rewrite 的日志记录,它将为您提供您想要的内容。

如果你有权访问.htaccess文件在正在服务的文件系统中,您可以在那里进行配置更改以激活日志记录。

否则,反复试验可能是您最好的选择!

答案4

我知道这是 IIS 中的一个标头,我不知道 Apache,但是如果您在服务器端脚本(ASP/PHP/whatever)中查询它,标头 UNENCODED_URL 或 HTTP_URL 可能会为您提供服务器端 URL。

然后,您可以使用它在 .htaccess 中回溯规则

相关内容