2012-01-02 86 views
4

這種重寫規則爲什麼Apache刪除多個斜線?

RewriteRule ^test/(.*)$ test.php?url=$1

在此URL

mysite.com/test//one///two////three///

是給了我這個結果

$1=url='one/two/three/'

我使用的EasyPHP如果它很重要,我喜歡知道爲什麼Apache在內部刪除多個斜槓而沒有重定向到更正的URL?以及如何禁用或添加重定向到此行爲?

預先感謝

+0

雖然多個斜槓在由「RewriteRule」_pattern_匹配的URL路徑中摺疊,但您仍然可以通過在「RewriteCond」指令中使用「%{REQUEST_URI}」服務器變量來訪問完整URL(以及其他斜線) 。看到這個問題:http://stackoverflow.com/questions/38561645/htaccess-rewrite-removes-trailing-slashes – DocRoot 2016-07-25 09:26:36

回答

8

看來多個斜槓是針對標準。正如this post指出,RFC 1630說:

PATH

的URI的其餘部分遵循取決於 方式的格式結腸。該路徑的解釋取決於所使用的協議 。但是,當它包含斜線時,這些頂點意味着分層結構。

///並不意味着分層結構 - 您將擁有空文件夾名稱。從那裏我會猜測Apache的行爲是有目的的。 (使用多個斜線也不是一個好主意,因爲這會導致無效的URL)。

我會使用不同的字符來代替。

+0

謝謝。並且如果搜索引擎跟蹤從另一個網站到我的多個斜槓鏈接,這種行爲是否會造成重複的內容? – Drust 2012-01-02 10:38:47

+0

@Drust我希望Google修復這個鏈接,但我無法確定。但是如果Apache用301修復它,我認爲谷歌應該瞭解 – 2012-01-02 13:49:07

+2

@Pekka,「Apache/2.4.6(CentOS)」不會提供301重定向(在這種情況下,谷歌會將所有的URL與/ //「到一個正確的URL)。相反,它看起來像Apache重寫所請求的URI,所以如果請求是「GET/test /// HTTP/1.1」,那麼'REQUEST_URI'將是'test /'。我認爲這是不好的,因爲我想要完整的請求URI到我的腳本,它將處理它...仍在尋找解決方案。 – 2015-08-05 21:03:37