2017-10-05 26 views
1

我安裝了添加了以下到我的.htaccess一些PHP軟件:當第一個參數只是一個點時,RewriteRule如何工作?

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

這是什麼做的?

我的理解,這顯然是錯誤的:它是捕捉http://foo.bar.comhttp:foo.bar.com,然後替換任何字符,.,與http:/foo.bar.com。絕對不是,對吧?

+0

%{REQUEST_URI}與域不匹配,它是%{HTTP_HOST}與foo.bar.com匹配,讓我知道您需要什麼? –

+0

啊,好的。然後我錯了。但無論如何,我試圖瞭解它的功能。爲什麼會有雙重正斜槓? –

+0

這段代碼真的給了我新的技術來提高用戶體驗水平,所以當用戶誤添加一些斜槓時,他應該正確地去,非常感謝 –

回答

4

它捕捉http://foo.bar.comhttp: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爆發。)


我想補充一點,這種方法並不特別有效,因爲它需要多個外部重定向如果你有很多額外的斜槓(儘管你可能會說這只是爲了緩存邊緣案例)。例如,給定爲的請求時,將發生以下的重定向:

  1. (初始請求/重定向)
  2. /foo//bar///baz(重定向)
  3. /foo//bar//baz(重定向)
  4. /foo//bar/baz(重定向)
  5. /foo/bar/baz
+1

哦,我明白了。第一個'RewriteRule' arg不是要被替換的正則表達式,而是一個正則表達式來過濾要轉換爲第二個arg的URL集合。謝謝! –

+2

是的,你是100% –

+0

是的,'RewriteRule' _pattern_限制指令適用的URL。理想情況下,這應該儘可能限制 - 這是在文件之前的「RewriteCond」指令之前處理的第一件事情。我已經爲我的回答添加了一些關於「爲什麼」可以檢查URL中的多個斜線的問題。 – MrWhite

3

MrWhite has explained very nicely解釋您所面對的規則。但是,當將帶有多個斜線的網址發送到您的網絡服務器時仍存在問題,例如。您的規則在解析爲/foo/bar/baz之前會導致5次重定向。

下面的評論部分有一些討論,他的回答是什麼應該是在單個重定向中完成此操作的規則。

這裏是一個規則,將刪除所有多斜線的URL到一個單一的斜線網址在單一的重定向

RewriteEngine On 

RewriteCond %{REQUEST_URI} // 
RewriteRule ^.*$ /$0 [R=301,L,NE] 

它使用RewriteRule指令,它已獲得多個斜線匹配模式的反向引用免費搭配mod_rewrite發動機。

相關問題