webextension:为什么浏览器会在请求的URL中添加一个斜杠



当我向http://www.example.com发出请求时,为什么我会在webRequest.onBeforeRequestListener中看到http://www.example.com/

例如:

chrome.webRequest.onBeforeRequest.addListener(
details => console.log('Sending request to', details.url),
{ urls: ['<all_urls>'] });
fetch('http://www.example.com');

将打印

Sending request to http://www.example.com/

这与网络请求监视器中显示的请求URL一致。例如,如果我将其转换为curl命令,则请求如下所示:

curl 'http://www.example.com/' -H 'Accept: */*' -H 'Connection: keep-alive'
-H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.9'
-H 'User-Agent: ...' --compressed

因此,发出的原始请求是针对http://www.example.com/的,而不是针对http://www.example.com的。这个决定一定是在浏览器中做出的,而不是由服务器做出的。

当使用XMLHttpRequest而不是fetch时,也会发生相同的行为。在我的例子中,我使用了Chrome,但在Firefox上是一样的。

问题:

  • 为什么浏览器会自动更改它?其他URL也会出现这种情况。根据我的理解,添加尾部斜杠通常会起作用,但总的来说,这是一个突破性的变化
  • 如果我想在onBeforeRequest侦听器中筛选到特定URL的当前请求,如何可靠地匹配它?例如,仅仅检查URL是否相同就会失败
  • 浏览器中是否有更多的重写URL规则需要注意

想想,我找到了。浏览器只是在修复一个无效的URL。

引用维基百科,URL如下:

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

如果存在授权部分,路径必须以单斜杠(/)开头,如果没有,路径也可以,但不能以双斜杠开头。路径总是被定义的,尽管定义的路径可能是空的(零长度),因此没有尾部斜杠。

http://example.com有一个权限部分(在本例中,模式加上主机名:http://example.com),但这会使路径为空。根据规范,路径必须以/开头,因此浏览器通过用/替换空路径来修复它。

如果你使用一个有效的URL,比如http://example.com/abc,它就不需要修改它

最新更新