我该如何调试mod_rewrite规则?

Doi*_*oin 6 debugging .htaccess mod-rewrite

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

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

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

    <?='<pre>',htmlentities(print_r($_GET,true)),'</pre>'?>
    
    Run Code Online (Sandbox Code Playgroud)

    是你所需要的全部.

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

    RewriteRule (.*) /show.php?url=$1 [END]
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

RewriteRule ^show.php$ - [L]
Run Code Online (Sandbox Code Playgroud)

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

tuc*_*son 7

其他可能性:

使用这个在线htaccess测试仪:

http://htaccess.madewithlove.be/


MBR*_*MBR 4

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

你的 PHP 有一个小错误:

<?='<pre>',htmlentities(print_r($_GET),true),'</pre>'?>
Run Code Online (Sandbox Code Playgroud)

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

我认为你的意图是:

<?='<pre>',htmlentities(print_r($_GET, true)),'</pre>'?>
Run Code Online (Sandbox Code Playgroud)

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

<i>text</i>
Run Code Online (Sandbox Code Playgroud)

将被翻译为:

&lt;i&gt;text&lt;/i&gt;
Run Code Online (Sandbox Code Playgroud)

这将导致浏览器显示:

<i>text</i>
Run Code Online (Sandbox Code Playgroud)

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

文本