为什么在域名后编码第一个斜杠会破坏URL?

5

您好!我发现一种特定的URL编码方式会破坏链接。记录一下,%2f代表斜杠字符:/

现在考虑这个链接:

原始链接:http://dottech.org/95285/this-is-the-pacific-barreleye-a-fish-with-a-transparent-head-amazing-photo-of-the-day

使用javascript的(encodeURIComponent) URL编码后的链接:http://dottech.org%2f95285%2fthis-is-the-pacific-barreleye-a-fish-with-a-transparent-head-amazing-photo-of-the-day

现在,如果您将编码后的链接粘贴到浏览器的地址栏中,它就会损坏(Firefox、Chrome、IE)。

但是,如果您不对第一个斜杠进行URL编码,它就可以完美地工作: 'http://dottech.org/95285%2fthis-is-the-pacific-barreleye-a-fish-with-a-transparent-head-amazing-photo-of-the-day

为什么呢?


1
要对完整的URL进行编码,请使用encodeURI-encodeURIComponent对URL位置的协议、主机、端口、路径名、哈希和搜索进行编码。 - kennebec
1个回答

5
/是一个保留字符,它与%2f不等同。如果需要斜杠而不带其定义的含义,则应使用编码形式。
请参阅RFC 3986:“保留字符”
引用: 目的是提供一组可在URI中与其他数据区分开来的定界字符。使用替换保留字符及其相应的百分号编码八位字节的URI并不等效。百分号编码保留字符或解码与保留字符对应的百分号编码八位字节会改变大多数应用程序解释URI的方式。
之所以即使您不使用保留字符/也可以在第二个斜杠上使用提到的URL的原因是,他们的CMS只是查找URL中的ID部分。因此,您可以向URL添加任何内容,例如以下内容仍将起作用:
http://dottech.org/95285/hey-this-URL-got-featured-at-stackoverflow

然而,在他们的情况下,它似乎仍然必须是/%2f

如果您尝试使用维基百科文章,它会重定向到首页:

http://en.wikipedia.org/wiki%2fStack_Overflow

那么,为什么他们称其为“URL编码”,其中“/”被编码为“%2f%”? - bgmCoder
@BGM:我不明白你的意思。谁称之为URL编码?规范中提到的是百分号编码。 - unor
嗯,在JavaScript函数中。该函数称为encodeURI,它将斜杠更改为标记。也许我弄反了什么? - bgmCoder
2
@BGM:因为这是如何定义encodeURIComponent的:“您应该在任何将作为URI的一部分传递的用户输入参数上调用encodeURIComponent”。用户可能不应该能够输入保留字符。因此,encodeURIcomponent编码所有内容 除了:字母、十进制数字、- _ . ! ~ * ' ( ) - unor
%2F没有层次意义,因此不被视为/。请参见W3C的URI建议中的示例2。-摘自https://dev59.com/Y3I-5IYBdhLWcg3wO1vl#42487180 - koppor
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接