TG Telegram Group & Channel
yzqzss|一座桥在水上's Note | United States America (US)
Create: Update:

又是被 URL 创的一天:我还在被 url 折磨……

1.
空格的 escape 规则是脑溢血, path 部分必须用 %20,path 中的 + 就表示加号本身;query 部分可以用 %20 或 + ,加号本身反而需要转义。(为什么呢?因为历史遗留问题,我甚至也没找到 + 的标准在哪儿定义的,RFC 3986 里真没写 + 可以用于转义空格)
https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20

(for backwards compatibility: do not try to search for it in the URI standard)


现代浏览器使用 %20。但是各种语言的库出于兼容性仍然使用 + 来 escape 空格。

但是但是,在非 web 的世界里,大家又遵守标准的 URI 规范了……如 mailto 中:

Note that for email links, you do need %20 and not + after the ?. For example, mailto:[email protected]?subject=I%20need%20help. If you tried that with +, the email will open with +es instead of spaces.


2.
由于 / 可被 escape 成 %2F ,而 url path resolve 标准化 (处理 path 中的 ../ 和 ./) 过程只对 / 字面量生效 (resolve 发生在 url unescape 之前)
而经过 unescape 后,%2F 和真正的 / 都被 unescape 成了 /,这时候 url 的 path 就不是它真正的 path 了。

所以需要保留原始的 path 用于正确处理 url join ,而不是用解码后的 path。

我感觉这里会有好玩的事情发生。
如果一些 http web 框架/反向代理/WAF/CDN 的机制不一致,比如一个是用 resolve+unescape 后的 path 来路由,一个使用 resolve 了但没有 unescape 的 path 来路由,一个使用原始的 path 来路由。
嘿嘿嘿/

3.
url path 中如果出现非有效 hex 的百分号编码(比如 %ZZ),基本上各种 http server 会无条件拒绝,返回 400 ,有些则是直接断连接。
但是,如果 query 中出现了非有效的 hex,大家的选择是丢掉坏掉的那一项 query kv pair。

yzqzss|一座桥在水上's Note
今天看了啥: https://html.spec.whatwg.org/multipage/urls-and-fetching.html#resolving-urls Let encoding be UTF-8. If environment is a Document object, then set [encoding] (document charset) to environment's character encoding. https://url.spec.whatwg.org/#query…
又是被 URL 创的一天:我还在被 url 折磨……

1.
空格的 escape 规则是脑溢血, path 部分必须用 %20,path 中的 + 就表示加号本身;query 部分可以用 %20 或 + ,加号本身反而需要转义。(为什么呢?因为历史遗留问题,我甚至也没找到 + 的标准在哪儿定义的,RFC 3986 里真没写 + 可以用于转义空格)
https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20
(for backwards compatibility: do not try to search for it in the URI standard)


现代浏览器使用 %20。但是各种语言的库出于兼容性仍然使用 + 来 escape 空格。

但是但是,在非 web 的世界里,大家又遵守标准的 URI 规范了……如 mailto 中:

Note that for email links, you do need %20 and not + after the ?. For example, mailto:[email protected]?subject=I%20need%20help. If you tried that with +, the email will open with +es instead of spaces.


2.
由于 / 可被 escape 成 %2F ,而 url path resolve 标准化 (处理 path 中的 ../ 和 ./) 过程只对 / 字面量生效 (resolve 发生在 url unescape 之前)
而经过 unescape 后,%2F 和真正的 / 都被 unescape 成了 /,这时候 url 的 path 就不是它真正的 path 了。

所以需要保留原始的 path 用于正确处理 url join ,而不是用解码后的 path。

我感觉这里会有好玩的事情发生。
如果一些 http web 框架/反向代理/WAF/CDN 的机制不一致,比如一个是用 resolve+unescape 后的 path 来路由,一个使用 resolve 了但没有 unescape 的 path 来路由,一个使用原始的 path 来路由。
嘿嘿嘿/

3.
url path 中如果出现非有效 hex 的百分号编码(比如 %ZZ),基本上各种 http server 会无条件拒绝,返回 400 ,有些则是直接断连接。
但是,如果 query 中出现了非有效的 hex,大家的选择是丢掉坏掉的那一项 query kv pair。


>>Click here to continue<<

yzqzss|一座桥在水上's Note






Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)