2011-10-18 113 views
6

這是一個「自己提出問題並自己回答」的案例,我將這篇文章發佈給任何有同樣問題的人。如何調試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] 
    

的效果是一樣的在常規插入打印語句程序。它會讓你知道:(a)你在規則集中達到了這一點,(b)當前重寫的URL是什麼。

它不像真正的調試工具那樣閃光,但它完成了工作。

如果您使用的是Apache < 2.3.9,則必須使用[L]而不是[END]。在這種情況下,需要注意的是你的規則集不應該試圖將「/show.php」重寫爲其他任何內容。如果這是一個問題,您可以通過在最頂部加入這一規則解決它:

RewriteRule ^show.php$ - [L] 

...請記住,當你完成調試將其刪除!

+0

更有用的技巧是[這裏](http://stackoverflow.com/questions/9153262/tips-for-debugging-htaccess-rewrite-rules)。 – Doin

回答

4

非常有益的見解。多年來,我一直在試圖弄清楚如何調試mod_rewrite規則,而不需要擁有root訪問權限,並且必須將規則放在httpd.conf中。這樣做!

你在你的PHP一個小的失誤:)

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

在此代碼,的print_r(輸出在$ _GET到stdout一切,然後返回值true,這ヶ輛()拿起作爲其第一個論據。 htmlentities()也接收字面爲真的第二個參數,它是一個可選參數,它告訴htmlentities()是否混淆單引號和/或雙引號。

我想你打算是:

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

這告訴的print_r()在$ _GET一切格式化。作爲print_r()的第二個參數傳遞true告訴它不要將結果輸出到stdout,而是將結果放入一個字符串中,並將該字符串作爲print_r()的返回值返回。然後,htmlentities()接收該字符串作爲其一個輸入參數,並執行適當的替換來強制瀏覽器按原樣顯示字符串,而不允許瀏覽器解釋該字符串。例如。 -

<i>text</i> 

將得到翻譯爲:

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

,這將導致瀏覽器顯示:

<i>text</i> 

,而不是斜體顯示單詞 「text」:

text

+0

Egad!你是對的!現在已經修復了。感謝您的支持。 – Doin