为什么url-encoding在域破坏url之后的第一个斜杠?

bgm*_*der 5 javascript url urlencode hyperlink

Salvete!我发现某种url编码方式打破了链接.记录%2f代表正斜杠字符:/

现在,考虑一下:原始链接: http://dottech.org/95285/this-is-the-pacific-barreleye-a-fish-with-a-transparent-head-amazing-photo-of-the-day

javascript(encodeURIComponent)urlencoded链接: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

为什么?

uno*_*nor 5

/是一个保留字符.它等同于%2f.如果您需要没有定义含义的斜杠,则使用编码形式.

请参阅RFC 3986:"保留字符":

保留字符的目的是提供一组可与URI中的其他数据区分开的分隔字符.将保留字符替换为其对应的百分比编码八位字节的URI不同.编码保留字符的百分比,或解码与保留字符对应的百分比编码八位字节,将改变大多数应用程序解释URI的方式.

如果您不使用保留字符串/作为第二个斜杠,则提及URL仍然有效的原因是:他们的CMS只是在URL中查找ID部分.因此,您可以向URL添加任何内容,例如以下内容仍然有效:

http://dottech.org/95285/hey-this-URL-got-featured-at-stackoverflow
Run Code Online (Sandbox Code Playgroud)

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

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

http://en.wikipedia.org/wiki%2fStack_Overflow
Run Code Online (Sandbox Code Playgroud)

  • @BGM:因为那是[如何定义`encodeURIComponent`](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIcomponent):"你应该在任何用户输入的上调用encodeURIComponent将作为URI的一部分传递的参数".用户不应该能够输入保留字符.所以`encodeURIcomponent`编码*所有***除了**:字母,十进制数字,` - _.!〜*'()`. (2认同)