2011-05-10 138 views
6

我形我頁兩種不同的RewriteRules:重寫規則會導致頁面重新加載兩次

# Enable URL Rewriting 
RewriteEngine on 

# exclude followed stuff 
RewriteRule ^(js|img|css|favicon\.ico|image\.php|anprobe|content|libs|flash\.php|securimage)/ - [L,QSA,S=2] 

# conditions (REQUEST dont point @ file|dir|link) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-F 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 

# rules 
RewriteRule ^(?!index\.php)brillen/(.*(brillen)|360|neu)/(.*)([a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}(?!\.))(.*)$  /index.php/brillen/$1?art_id=$4&$5&%{QUERY_STRING}  [NS,QSA,L] 
RewriteRule ^(?!index\.php)(.*)$               /index.php/$1         [NS,QSA,L] 

...我現在遇到一個奇怪的問題,就在於每個請求導致頁面內加載了兩次,這導致數據庫操作和電子郵件分派也被執行兩次的問題。

有沒有人有關於此的想法?

在此先感謝!

注1:根據瀏覽器的資源跟蹤,所有請求的資源都是有效的和可用的。

注2:問題可能起源於保留和後處理PATH_INFO? (/index.php/$1=> /index.php/foo/bar/...)

+0

是什麼讓你覺得每個頁面加載兩次? – qbert220 2011-05-10 10:36:18

+0

正如我所提到的:數據庫操作和電子郵件分派執行兩次...我通過發射一些syslog來驗證我的假設,它也出現兩次。 – proximus 2011-05-10 10:43:03

+0

錯誤的來源是一些PHP代碼被調用兩次......對我感到羞恥! :( – proximus 2011-05-10 11:20:08

回答

8

重寫引擎無法使單個HTTP請求運行兩次。它將Apache的HTTP請求路由到靜態文件,代理函數或模塊(如PHP),並請求發生變化。但它不能克隆請求,並給它2次到Apache。

當你有任何「運行兩次」的問題的機會是,你是由空圖像網址錯誤。事實上,它不是一個真正的錯誤,它是HTML的一個特性(至少在HTML5之前)以及url解析的一個特性。

如果你得到某個地方空GET URL,HTML指出瀏覽器應該重新發送相同的查詢(給他當前頁的那個)相同的參數。這可以使POST請求發生2次(如果請求的第一頁是POST)。那麼這些空的GET網址在哪裏?大多數時候,你可以:

<IMG SRC="" ...> (in the HTML) 

或:

url() (in the css) 

或:

<script type="text/javascript" src=""></script> 
<link rel="stylesheet" type="text/css" href=""> (in the HTML headers) 

讀也@喬恩回答有關圖標查詢。您應該始終使用wget或telnet 80查詢來測試結果而無需瀏覽器行爲。

更新:詳細解釋和跟進this blog與HTML5添加應該刪除這種行爲的現代瀏覽器。

+0

我三重檢查了所有資源,並搜索了你提到的模式,但它們都不適用...甚至在瀏覽器(js)控制檯上沒有輸出。 – proximus 2011-05-10 10:05:35

+0

在網絡掃描上的螢火蟲上,你沒有看到第二個html請求?如果你用lynx或telnet嘗試你會得到第二個執行嗎? – regilero 2011-05-10 10:35:48

+0

沒有第二個請求在firebug中可見。第二個請求實際上對用戶是不可見的,似乎只是在內部完成(因此它是隻有在我的系統日誌中才可以看到)使用lynx調用頁面時也是如此 – proximus 2011-05-10 10:53:22

1

我有同樣的問題(或者我認爲)。這是由favicon.ico的請求引起的,我在重寫規則中沒有考慮到這一點。

1

我有同樣的問題,造成的,因爲我做了一些URL重寫,而劇本中加載了兩次,由於這樣的事實,我沒有補充一點:

RewriteRule ^(js|img|css|favicon\.ico)/ - [L,QSA,S=2] 

這將從停止腳本被加載兩次;它解決了我的問題。