2012-04-15 59 views
23
http://example.com/something/somewhere//somehow/script.js 

雙斜線是否會破壞服務器端的任何內容?我有一個解析URL的腳本,我想知道如果我用單斜槓替換多個斜槓,它是否會破壞任何東西(或更改路徑)。特別是在服務器端,像CodeIgniter和Joomla這樣的框架使用分段的url方案和路由。我只想知道它是否會破壞任何東西。帶有多個正斜槓的網址,是否會破壞任何內容?

回答

25

HTTP RFC 2396定義路徑分隔符爲單斜槓。但是,除非您使用某種URL重寫(在這種情況下,重寫規則可能會受到斜線數量的影響),否則uri會映射到磁盤上的路徑,但是(大多數?)現代操作系統(Linux/Unix,Windows),一行中的多路徑分隔符沒有任何特殊含義,所以/ path/to/foo和/ path //最終映射到同一個文件。

可能會受到影響的另一件事是緩存。由於瀏覽器和服務器緩存單個頁面(根據其緩存設置),通過略微請求多個相同的文件不同的URI可能會影響緩存(取決於服務器和客戶端的實現)。

+0

你必須看看你引用文檔的3.3節(其中淘汰了,或RFC3986,但同意在這裏討論的行爲),它通過ABNF指定path_segments'如何'由至少一個'segment'道理,這本身可能是空的。這意味着像'//'這樣的字符序列在URI中是完全有效的。 – amn 2016-07-27 21:42:25

+0

@amn這是有效的,這裏沒有問題。但問題是它是否會破壞任何東西。它可能 - 如果你使用URL重寫(例如) – poncha 2016-07-28 06:13:44

+3

這是一個很好的答案!可惜它是https:///stackoverflow.com /////////////10161264/////6618577的副本,雖然... – 2017-08-02 15:26:01

10

URL不必映射到文件系統路徑。所以,即使//在文件系統路徑中與/相當,也無法保證所有URL都是如此。

2

考慮相關path-absolutenon-terminal"RFC3986: Uniform Resource Identifier (URI): Generic Syntax"聲明(指定的,因爲是典型的,在ABNF語法):

path-absolute = "/" [ segment-nz *("/" segment) ] 

再考慮segment聲明中的幾行進一步下跌的同一個文檔中:

segment  = *pchar 

如果您可以閱讀ABNF,星號(*)指定以下元素pchar可以重複m ulipple times to make up segment,including zero times。學習這一點,並重新讀取上述path-absolute聲明,可以看到,潛在的空segment imples第二"/"可以重複無限期,因此允許有效組合等//////(至少一個/的任意長度)的path-absolute部分(其本身用於指定描述URI的規則)。

由於所有的URL都是URI,所以我們可以得出結論,允許URL引用多個連續的正斜槓,即每個帶引號的RFC。

但並不是每個人都遵循或實現了每個規範的URI解析器,所以我相當肯定存在不兼容的URI/URL解析器和所有類型的軟件,這些軟件會在這些角落案例中破壞更大的系統。

1

您可能要考慮的一件事是它可能會影響您的搜索引擎中的頁面索引。據this網頁,

具有相同路徑的URL重複3次不會在谷歌

他們使用的例子進行索引是:

example.com/path/path/path/ 

我沒有如果你使用example.com///,這也是真實的,但我一定會想知道SEO優化是否對我的網站至關重要。

他們提到「這是因爲Google認爲它已經達到了URL陷阱。」如果其他人確實知道答案,請在此答案中添加評論;否則,我認爲有必要考慮這個案例。

5

這個問題的正確答案是它取決於服務器的實現

根據RFC 2396,雙斜槓在語法上是有效的,該RFC 2396定義了URL路徑語法,並且解釋爲意味着空的URI段。請注意,RFC 2396僅定義了語法,而不是語義的路徑,包括空路徑段,因此由您的服務器決定。

你沒有提到你正在使用的服務器軟件堆棧,也許你甚至自己動手了?

無論哪種方式,我想指出,這意味着你可能要避免,即使它們是語法上有效的雙斜線一些現實的原因:

  1. 由於空是有效不被大家所料,它導致錯誤。即使您今天的服務器技術可能與它兼容,但下一個服務器技術,或者您當前服務器技術的下一個版本可能決定不支持它(例如,當您嘗試時,ASP.NET MVC Web API庫會引發錯誤用雙斜線指定路線模板)。

  2. 某些服務器甚至可能會將//解釋爲指示返回到根路徑。這可以是在用,或錯誤......

  3. 因爲它有時是一個錯誤,因此,有些服務器堆棧和防火牆假設//是企圖利用該bug(它是否是一個真正的錯誤或不),即一個目錄遍歷攻擊,並且甚至在解釋URI路徑之前給你提供403 Forbidden

0

你的問題是「它是否破壞任何東西」。根據URL規範,沒有它的作品。不讀RFC,這裏是一個快速的實驗中,你可以嘗試:

cat > tmp.php <<'EOF' 
<?php 
echo $_SERVER['REQUEST_URI']; 
EOF 
php -S localhost:4000 tmp.php 

現在打開你的瀏覽器http://localhost:4000/hello//world

0

在您的應用程序建立鏈接的資源時,你會感到驚奇例如。

<script src="mysite.com/resources/jquery//../angular/script.js"></script> 

不會解決到mysite.com/resources/angular/script.jsmysite.com/resources/jquery/angular/script.js你可能不想

雙斜槓是邪惡的東西,儘量避免它們。

相關問題