为什么 JavaScript 中的非 http(s) URL 无法更改 URL 对象的协议?

问题描述 投票:0回答:1

在 JavaScript 中,使用

URL
对象更改给定 URL 的协议时似乎存在一些限制。但是,我找不到记录此行为的位置(
URL
URL.prototype.protocol
)或为什么要让它这样工作。

有人能解释一下吗?

编辑:跨 JS 运行时的行为似乎不一致。 Firefox、Node 和 Deno 都“拒绝”更改协议,但 Chrome、Safari 和 Bun 都“遵守”更改……

const url1 = new URL('http://example.com')
console.log(url1.protocol) // http:
url1.protocol = 'https:'
console.log(url1.protocol) // https:

const url2 = new URL('webcal://example.com')
console.log(url2.protocol) // webcal:
url2.protocol = 'https:'
console.log(url2.protocol) // webcal:, but should be https:

javascript url
1个回答
0
投票

这是 Node.js 的文档

WHATWG URL 标准考虑了一些 URL 协议方案来 就它们的解析和序列化方式而言,它们是“特殊”的。当一个 URL 使用这些特殊协议之一进行解析, url.protocol属性可以更改为其他特殊协议,但是 不能更改为非特殊协议,反之亦然。


例如,从 

http

更改为

https
有效:[...]
但是,从 http 更改为假设的 Fish 协议并不意味着
因为新协议并不特殊。 […]

同样,从非特殊协议更改为特殊协议 也是不允许的:[...]

根据WHATWG URL标准,特殊的协议方案是

ftp

file
http
https
ws
wss

您的
webcal

协议不在该列表中,因此您无法将其更改为

https
    

© www.soinside.com 2019 - 2024. All rights reserved.