2013-07-02 34 views
2

我已經建立了一個簡單的.htaccess文件直接請求如下樣本index.php文件:[L]標記如何導致我的網址部分重複?

RewriteEngine On 

RewriteRule ^foo/(.*)$ bar/$1 # [L] here changes output 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?request=$1 

訪問devserver.com/foo/baz導致的bar/baz/baz一個$_GET['request']。將[L]標誌添加到第一個RewriteRule給我的預期結果bar/baz

我讀過很多人誤解[L]旗的問題/答案,認爲它會結束所有重寫。我知道情況並非如此,也沒有看到[L]國旗應該如何真正在這裏有所作爲。

下面是我設想發生在這裏,第一沒有[L]步驟:

  1. 請求URL開始爲foo/baz
  2. 要求第一條規則相匹配,則改寫爲bar/baz
  3. 請求繼續處理和火柴RewriteCond
  4. 請求匹配下一條規則,並重寫爲index.php?request=bar/baz
  5. 新的迭代開始與index.php?request=bar/baz要求
  6. 新的請求沒有匹配的規則,並最終輸出

,然後用[L]:

  1. 請求URL開始爲foo/baz
  2. 要求第一條規則相匹配,則改寫到bar/baz
  3. 新的迭代開始請求bar/baz
  4. 請求做esn't比賽直到RewriteCond
  5. 請求下一條規則相匹配,則改寫爲index.php?request=bar/baz
  6. 新迭代與index.php?request=bar/baz
  7. 新的請求的請求開始沒有匹配的規則,並最終輸出

在這簡化的情況下,我無法理解baz如何得到重複。我誤解了什麼?

編輯:在第一個RewriteRule下面添加這個結果導致的最後test/baz。不知道這意味着什麼:

RewriteCond %{REQUEST_URI} ^/foo/baz$ 
RewriteRule ^bar/baz/baz$ /test 
+0

所以我們都知道'[L]'停止處理更多的規則。由於您的第一次重定向是相對URL,因此可能會出現此問題。你有沒有做過任何其他測試? –

+0

我同意** Rob W **,這很可能是因爲重定向和因此重新處理'/ bar/baz'導致的結果 –

+0

@RobW,我一直在嘗試圍繞這個測試半天,沒有這實際上已經讓人們對真正發生的事情有了更多的瞭解。這是純粹的版本。儘管如此,我仍會編輯一個問題。我不確定相對URL如何改變,因爲/ bar *仍然不能匹配任何內容。 – rotanimod

回答

1

與此相反,每天 規則之前追加到URI的PATH_INFO僅反映了這一輪 mod_rewrite的處理前的PATH_INFO的值。因此,如果將大部分URI 匹配並複製到多個RewriteRule 指令中的替代中,而不考慮URI的哪些部分來自當前PATH_INFO,則最終的URI可能會附加多個副本PATH_INFO 到它。

爲了防止這種情況發生,你需要使用的DPI標記,這樣你的規則是:

RewriteEngine On 

RewriteRule ^foo/(.*)$ bar/$1 [DPI] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?request=$1 

的DPI標誌將採取去除它的路徑信息的服務。 You can read more here.

+0

謝謝!我完全不知道PATH_INFO的功能。這似乎應該是一個更常見的問題,如果它只需要一個雙斜槓的網址.... – rotanimod

+0

@rotanimod是啊我不是,我非常感興趣是什麼導致問題,所以我去看看重寫日誌並注意路徑信息。請注意,在2.11之前的httpd版本或類似的東西上,postfix上還有一個錯誤,或者有些東西不記得它。 – Prix