如何调试 mod_rewrite 规则?

Posted

技术标签:

【中文标题】如何调试 mod_rewrite 规则?【英文标题】:How can I debug mod_rewrite rules? 【发布时间】:2011-12-10 01:14:39 【问题描述】:

这是一个“提出问题并自己回答”的案例,我发布它是为了让遇到同样问题的人受益。

我在调试共享服务器上的 .htaccess 文件中的 mod_rewrite 规则集时遇到了一些问题,我什至无法访问 Apache 错误日志。我找到了一种调试它们的巧妙方法,就是这样:

    编写一个简短的脚本,简单地打印出它的查询字符串变量。例如在 php 中:

    <?='<pre>',htmlentities(print_r($_GET,true)),'</pre>'?>
    

    就是你所需要的。

    假设您将此脚本命名为“show.php”并将其放在 /public_html 中。然后在您的 .htaccess 文件中,确定您认为可能导致问题的规则集中的点,并插入此规则:

    RewriteRule (.*) /show.php?url=$1 [END]
    

效果与在常规程序中插入 PRINT 语句相同。它会让您知道 (a) 您已到达规则集中的那个点,以及 (b) 当前重写的 URL 是什么。

它不像真正的调试工具那样闪存,但它可以完成工作。

如果您使用的是 Apache [L] 而不是 [END]。在这种情况下,需要注意的是您的规则集不应尝试将“/show.php”重写为其他任何内容。如果这是一个问题,您可以通过在最顶部添加此规则来解决它:

RewriteRule ^show.php$ - [L]

...请记住在完成调试后将其删除!

【问题讨论】:

更多有用的技术是here。 【参考方案1】:

其他可能性:

使用这个在线 htaccess 测试器:

http://htaccess.madewithlove.be/

【讨论】:

【参考方案2】:

非常有用的见解。多年来,我一直试图弄清楚如何调试 mod_rewrite 规则,而无需拥有 root 访问权限,也不必将规则放在 httpd.conf 中。这样就可以了!

你的 PHP 有一个小错误:

<?='<pre>',htmlentities(print_r($_GET),true),'</pre>'?>

在这段代码中,print_r() 将 $_GET 中的所有内容输出到 stdout,然后返回值 true,htmlentities() 将其作为第一个参数。 htmlentities() 还接收文字 true 作为其第二个参数,这是一个可选参数,告诉 htmlentities() 是否使用单引号和/或双引号。

我认为你的意图是:

<?='<pre>',htmlentities(print_r($_GET, true)),'</pre>'?>

这告诉 print_r() 格式化 $_GET 中的所有内容。将 true 作为第二个参数传递给 print_r() 告诉它不要将结果输出到 stdout,而是将结果放入字符串中并将该字符串作为 print_r() 的返回值返回。 htmlentities() 然后接收该字符串作为它的一个输入参数,并进行适当的替换以强制浏览器按原样显示该字符串,而不是让浏览器解释该字符串。例如。 -

<i>text</i>

将被翻译成:

&lt;i&gt;text&lt;/i&gt;

这将导致浏览器显示:

<i>text</i>

而不是用斜体显示单词“text”:

文本

【讨论】:

埃加德!你说得对!现在已经修好了。感谢您了解这一点。

以上是关于如何调试 mod_rewrite 规则?的主要内容,如果未能解决你的问题,请参考以下文章

在 mod_rewrite 规则中转换为小写

如何使用 apache mod_rewrite 规则重定向到动态 URL(不是经典重定向)?

mod_rewrite:重写规则还是重定向?

mod_rewrite 到 nginx 重写规则

使用 mod_rewrite 重写用户代理规则

XAMPP httpd.conf 设置以允许 mod_rewrite 规则