我安裝了添加了以下到我的.htaccess一些PHP軟件:當第一個參數只是一個點時,RewriteRule如何工作?
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
這是什麼做的?
我的理解,這顯然是錯誤的:它是捕捉http://foo.bar.com
爲http:
和foo.bar.com
,然後替換任何字符,.
,與http:/foo.bar.com
。絕對不是,對吧?
我安裝了添加了以下到我的.htaccess一些PHP軟件:當第一個參數只是一個點時,RewriteRule如何工作?
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
這是什麼做的?
我的理解,這顯然是錯誤的:它是捕捉http://foo.bar.com
爲http:
和foo.bar.com
,然後替換任何字符,.
,與http:/foo.bar.com
。絕對不是,對吧?
它捕捉
http://foo.bar.com
爲http:
和foo.bar.com
,然後替換任何字符,.
,與http:/foo.bar.com
。絕對不是,對吧?
對,絕對不是。 :)
該代碼減少了在單個斜槓的URL路徑中一起出現的多個斜槓。所以像example.com/foo//bar////baz
這樣的URL變成example.com/foo/bar/baz
。
REQUEST_URI
服務器變量僅包含URL路徑(以斜槓開始)。例如。 (在上例中)。 %1
和%2
是在最後匹配的CondPattern(即雙斜槓的任一側的字符串)中捕獲的組的反向引用。
在匹配單個字符的RewriteRule
圖案的單個點(.
)。因此,當URL路徑爲空時,此規則會匹配除文檔根之外的每個URL。
爲什麼要檢查多個斜線?如果這些是對物理文件的請求,那麼Apache將隱式地減少多個斜槓以便爲資源提供服務。所以/foo//bar////baz.html
將返回相同的/foo/bar/baz.html
。所以,這是「好」。然而,這些在技術上是不同的URL,所以這可能被搜索引擎認爲是重複內容。如果您爲了其他目的解析URL,它也可能會破壞您的應用程序。這可能是也可能不是問題。這就要求用戶鏈接到錯誤地等(除非東西在你的web應用程序,導致產生這些URL爆發。)
我想補充一點,這種方法並不特別有效,因爲它需要多個外部重定向如果你有很多額外的斜槓(儘管你可能會說這只是爲了緩存邊緣案例)。例如,給定爲的請求時,將發生以下的重定向:
/foo//bar///baz
(重定向)/foo//bar//baz
(重定向)/foo//bar/baz
(重定向)/foo/bar/baz
哦,我明白了。第一個'RewriteRule' arg不是要被替換的正則表達式,而是一個正則表達式來過濾要轉換爲第二個arg的URL集合。謝謝! –
是的,你是100% –
是的,'RewriteRule' _pattern_限制指令適用的URL。理想情況下,這應該儘可能限制 - 這是在文件之前的「RewriteCond」指令之前處理的第一件事情。我已經爲我的回答添加了一些關於「爲什麼」可以檢查URL中的多個斜線的問題。 – MrWhite
MrWhite has explained very nicely解釋您所面對的規則。但是,當將帶有多個斜線的網址發送到您的網絡服務器時仍存在問題,例如。您的規則在解析爲/foo/bar/baz
之前會導致5次重定向。
下面的評論部分有一些討論,他的回答是什麼應該是在單個重定向中完成此操作的規則。
這裏是一個規則,將刪除所有多斜線的URL到一個單一的斜線網址在單一的重定向:
RewriteEngine On
RewriteCond %{REQUEST_URI} //
RewriteRule ^.*$ /$0 [R=301,L,NE]
它使用RewriteRule
指令,它已獲得多個斜線匹配模式的反向引用免費搭配mod_rewrite
發動機。
%{REQUEST_URI}與域不匹配,它是%{HTTP_HOST}與foo.bar.com匹配,讓我知道您需要什麼? –
啊,好的。然後我錯了。但無論如何,我試圖瞭解它的功能。爲什麼會有雙重正斜槓? –
這段代碼真的給了我新的技術來提高用戶體驗水平,所以當用戶誤添加一些斜槓時,他應該正確地去,非常感謝 –