2011-12-04 73 views
3

我不是使用.htaccess的英雄,但我遇到了一個我認爲可能會導致它的問題。 第一個症狀:對數據庫進行的簡單更改(如用戶IP跟蹤)每次請求都完成了多次,而網站的輸出看起來還不錯。可能.htaccess導致循環?

後跟蹤我終於得出結論,這不是由數據庫本身引起的問題小時(100%確定),也不會被極其簡單一塊PHP代碼,我寫了(也100%地肯定) 。 不過,問題發生在不同的服務器上。我唯一的結論是它必須處理我的.htaccess文件。 對我來說,似乎每個請求在處理實際導致輸出的運行之前處理過幾次。

在我的public_html文件夾我把下面的.htaccess文件,這應該是每個請求重定向到「公共」文件夾:

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

在這種「公共」文件夾,我有另外一個.htaccess文件:

 
    <IfModule mod_rewrite.c> 
     RewriteEngine On 
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteRule ^(.*)$ index.php?requestedurl=$1 [PT,L] 
    </IfModule> 

該文件旨在處理每個使用index.php文件的請求。 注意:如果我重命名index.php文件並直接訪問它,則問題不會發生。

我根本沒有得到這種行爲,我希望這個星球上的任何人都這樣做。 在此先感謝, Hans

回答

2

理論上,所有重寫規則在執行任何文件之前都會得到處理。唯一可能導致數據庫被多次召回的錯誤是PHP代碼錯誤,它可能會多次調用一條線路,或者可能在調用後重定向頁面,然後htaccess會將其重定向到同一頁面。一個htaccess文件本身永遠不能做到這一點。

我不排除這種可能性,因爲程序等有時可以做一些非常隨機的事情,但是您需要更多地調試您的PHP代碼以消除它作爲源代碼。簡單的方法是簡單地通過,每次PHP做一些重要的事情時,添加一條打印行來表明它正在執行某些功能,特別是對於MySQL命令。這是查看它爲頁面加載所做的一切的快速方法。有時你會發現你會感到驚訝。

此外,通過您的Apache訪問日誌。它將爲用戶發送的每個GET請求打印一個新行。如果頁面永遠不會被重定向,那麼腳本不可能被用戶多次運行(如上所述,在確定最終路徑之前不會執行任何文件)。如果您在同一時間看到來自同一IP的多個GET請求,則會重定向或重新加載頁面。

+0

親愛animuson, 感謝您的快速回復。 您讓我意識到請求可能會導致次要請求(通過客戶端),從而給了我一個很大的線索。 不存在的文件也將被重定向到index.php。 例如:HTML指的是缺少favicon.ico文件。刪除該行修復了其中一個迭代。 我仍然需要找到一個,但我無法在HTML中找到它。 我會試着看看那個Apache日誌文件。謝謝。 對於請求的MIME類型進行PHP檢查並關閉任何不期待HTML的請求也是一個想法嗎? 再次感謝, Hans –

+0

請求不會發送他們期望*接收的MIME類型,但瀏覽器可以收到它應該期待的提示(即使它仍未發送)。將所有資源(如CSS,圖像和JavaScript)包含在單個文件夾中並從重寫中排除該文件夾會更好。 – animuson

+0

感謝您一起思考!我想我會試圖弄清楚如何排除應該排除在文件夾中的文件,而不是排除真正存在的文件。 另外:我刪除了問題的最後一個原因,所以它目前正常工作,沒有任何二次請求,這要感謝你。 –

3

您可以閱讀以前的答案:RewriteRule causes page to reload twice

的。 htaccess可以循環,甚至是無限循環,但最終只有一個服務器請求。所以這不是你的問題。查看鏈接,查看可以讓瀏覽器多次發送請求的事情(發生的事情比我們通常想象的要多)。

+0

感謝您的鏈接。 –