天天看點

修改.htaccess的重寫規則

在修複公司項目的時候,遇到一個問題:

點選首頁面的login按鈕,前往另一個登入頁面的時候。

位址欄重複出現:

這樣的錯誤。

在網上讨教了高人以後,訓示我去看apache的error_log。覺得這一招真的很不錯,是debug的重要步驟。這招趕緊學起來。然後在測試伺服器的log上看到一個值得注意的地方:

Request exceeded the limit of  internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.  
           

在網上檢視了一下這個問題,提到要用LogLevel去做debug。

我在正式伺服器上也找了一下,也發現了一模一樣的error。看來這個地方跟那個重複的url有關。

參考這個http://40era.com/1718/ 資料以後,發現在httpd.conf檔案裡添加以下這兩句之後,apache無法正常重新開機。估計是apache新版本更新屏蔽了。

RewriteLogLevel 
RewriteLog "/var/log/httpd/rewrite.log"
           

于是删掉這兩句,繼續查找可以檢視log的相關設定。在stackoverflow裡面找到了apache官網的資料:

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging

将這句加入以後,apache重新開機成功。然後到logs/error.log下面檢視這個trace3列印出來的錯誤。如上面那個40era所說的,有url的重複。因為是搭建在本地環境。都是127.0.0.1。是以我在.htaccess裡加入了這句話:

然後再重新開機了apache。發現那條錯誤消失了。而且我回到首頁點選login登陸按鈕的時候,竟然可以進入那個項目的登入頁面!隻不過沒有css樣式,圖檔以及還是load不到js庫。不過不會像之前一樣回到首頁面而且url重複。url顯示也正常。真是一個不小的進展。

然而還剩下一個問題就是依然load不到css/img/js這三個。看來還是跟.htaccess有關。繼續檢視相應的措施。

找到出問題的地方了。

在最外圍的htaccess,原來的$會自動更改為#,一旦更改為後者,css/js/img這些原來位于public文檔下的就會失效。

被修改的.htaccess内容如下(帶#):

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^# apg/public/    [L]
    RewriteRule  (.*) apg/public/#1 [L]
</IfModule>
           

正常的.htaccess應該為(帶$):

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^$ apg/public/    [L]
    RewriteRule  (.*) apg/public/ [L]
</IfModule>
           

然後開始艱苦卓絕的繼續查error_log工程……

最後同僚幫我解決了這個問題,說是apache底層服務的某幾個so子產品被我重新開機apache太多次弄壞了。是以導緻htaccess的重定向異常。他重新編譯了那幾個so子產品。就修複了這個問題。整個apache都被他扒光了一個個地排查。他說這是他第一次遇到這種問題。真是服了我了。

總而言之。問題解決了好開心,撒花!