2010-10-04 465 views
19

我有一種資源,它是一個. 這意味着我的網址是這樣的: http://myapp/index/ . ,我需要添加查詢參數,使得它看起來像這樣: http://myapp/index/.?type=xml 我用Freemarker我的資源的介紹,並提出針對這種情況百分比編碼黑客:URL資源是一個點(%2E)

<#if key?matches("\\.")> 
<li><a href="${contextPath}/index/%2E">${key}</a></li> 
</#if> 

這工作正常的Firefox。但所有其他瀏覽器如IE,Safari,Chrom,Opera只是忽略了我的URL編碼點(http://myapp/index/%2E)。

有什麼建議嗎?

回答

14

它實際上沒有真正明確的標準(RFC 3986)是否...百分比編碼版本說明應該具有相同的這個文件夾/上一文件夾含義的轉義版本。 3.3節只談及「路徑段...」,沒有明確它們在pct編碼之前還是之後匹配...

我個人覺得Firefox的解釋是%2E並不意味着.最實用,但不幸的是所有其他瀏覽器都不同意。這將意味着您不能擁有僅包含...的路徑組件。

我認爲唯一可能的建議是「不要那樣做」!還有其他路徑組件也很麻煩,通常是由於服務器限制:%2F,%00%5C序列中的路徑也可能被某些Web服務器阻止,並且空的路徑段也可能導致問題。因此,通常不可能將所有可能的字節序列都放入路徑組件中。

+0

我想我必須禁止該那麼,THX。 – cuh 2011-02-09 14:55:31

+1

我發現即使%2e是網址的一部分,例如'http:// localhost/index%2ehtml',Firefox(14)和Chrome將其轉換爲'.'。這在2.3節中有詳細說明。在3.3節的後面,它說'.'和'..'是在路徑名中相對引用的。所以,'http:// localhost /%2e'本質上意味着'http:// localhost /'。 – slowpoison 2012-07-20 03:59:40

+1

好點,@slowpoison - 「用相應的百分比編碼的US-ASCII字節代替未保留字符的URI是相同的」和「。」。是一個毫無保留的人物。呃,好吧。 – phyzome 2014-07-18 22:00:27

5

這是不可能的。 §2.3說「。」是一個毫無保留的字符,並且「用相應的百分比編碼的US-ASCII八位字節替換未預留字符的URI是相同的」。因此,/%2E%2E//../相同,並且將被標準化。

(這是bobince一個答案,並通過slowpoison註釋的組合。)