url资源是一个点(%2E)

cuh*_*cuh 23 url encoding freemarker restlet

我有一个资源是一个. 这意味着我的网址看起来像这样: http://myapp/index/. 我需要添加查询参数,使它看起来像这样: http://myapp/index/.?type=xml 我使用Freemarker来表示我的资源,并为这种情况做了一个百分比编码黑客:

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

这适用于Firefox.但所有其他浏览器,如IE,Safari,Chrom,Opera只是忽略了我的网址编码点(http://myapp/index/%2E).

有什么建议?

bob*_*nce 21

实际上,在标准(RFC 3986)中没有明确说明百分比编码版本.或者..应该具有与非转义版本相同的此文件夹/向上文件夹.3.3节只讨论"路径段...",但没有说明它们是否匹配.以及..pct-encoding之前或之后.

我个人认为Firefox的解释%2E并不意味着.最实用,但不幸的是其他所有浏览器都不同意.这意味着您不能拥有仅包含.或的路径组件...

我认为唯一可能的建议是"不要那样做"!还有其他的路径构件是太麻烦,通常是由于服务器限制:%2F,%00并且%5C也可以通过某些Web服务器被阻塞序列的路径,和空的路径段也可能会造成问题.因此,通常不可能将所有可能的字节序列拟合到路径组件中.


tre*_*ell 11

这不可能.§2.3说"." 是一个未保留的字符,"用相应的百分比编码的US-ASCII八位字节替换未保留字符的URI是等效的".因此,/%2E%2E/是相同的/../,并且将被标准化.

(这是bobince的回答和slowpoison的评论的组合.)