我该如何调试mod_rewrite规则?

时间:2011-10-18 12:04:35

标签: debugging .htaccess mod-rewrite

这是一个“问自己一个问题并自己回答”的案例,我发帖是为了任何有同样问题的人的利益。

我在共享服务器上的.htaccess文件中调试mod_rewrite规则集时遇到了一些问题,我甚至无法访问Apache错误日志。我发现了一种调试它们的简洁方法,即:

  1. 编写一个简短的脚本,只打印出它的查询字符串变量。例如用PHP:

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

    就是你所需要的一切。

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

    RewriteRule (.*) /show.php?url=$1 [END]
    
  3. 效果与在常规程序中插入PRINT语句相同。它会告诉您(a)您在规则集中达到了这一点,并且(b)当前重写的URL是什么。

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

    如果您使用的是Apache&lt; 2.3.9,则必须使用[L]代替[END]。在这种情况下,需要注意的是您的规则集不应该尝试将“/show.php”重写为其他任何内容。如果这是一个问题,您可以通过在最顶层添加此规则来修复它:

    RewriteRule ^show.php$ - [L]
    

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

2 个答案:

答案 0 :(得分:7)

其他可能性:

使用这个在线htaccess测试员:

http://htaccess.madewithlove.be/

答案 1 :(得分:4)

非常有帮助的洞察力。多年来,我一直试图弄清楚如何调试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”一词:

文本