“同网站”和“同源”是经常被提及但经常被误解的术语。例如,它们在页面转换、fetch()
请求、Cookie、打开弹出式窗口、嵌入的资源和 iframe 的上下文中使用。本页介绍了这些功能的含义以及它们之间的区别。
来源

“来源”是指架构(也称为协议,例如 HTTP 或 HTTPS)、主机名和端口(如果指定)的组合。例如,如果网址为 https://www.example.com:443/foo
,则“origin”为 https://www.example.com:443
。
“同源”和“跨源”
架构、主机名和端口组合相同的网站被视为“同源”。所有其他内容都被视为“跨源”。
来源 A | 来源 B | “同源”还是“跨源”? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | 跨源:不同网域 |
https://example.com:443 | 跨源:不同的子网域 | |
https://login.example.com:443 | 跨源:不同的子网域 | |
http://www.example.com:443 | 跨源:不同的架构 | |
https://www.example.com:80 | 跨源:不同的端口 | |
https://www.example.com:443 | 同源:完全匹配 | |
https://www.example.com | 同源:隐式端口号 (443) 匹配 |
网站

顶级域名 (TLD)(例如 .com
和 .org
)已列在根区域数据库中。在上例中,
“网站”是指架构、顶级域名 (TLD) 以及域名前面的部分(我们称之为 TLD+1)。例如,如果网址为 https://www.example.com:443/foo
,则“网站”为 https://example.com
。
公共后缀列表和 eTLD
对于包含 .co.jp
或 .github.io
等元素的网域,仅使用 .jp
或 .io
不足以识别“网站”。我们无法通过算法确定特定顶级域名的可注册域名级别。为此,公共后缀列表定义了一系列公共后缀(也称为有效顶级域名 [eTLD])。eTLD 列表的维护地址为 publicsuffix.org/list。
如需识别包含 eTLD 的网域的“网站”部分,请采用与 .com
示例相同的做法。以 https://www.project.github.io:443/foo
为例,架构为 https
,eTLD 为 .github.io
,eTLD+1 为 project.github.io
,因此 https://project.github.io
被视为此网址的“网站”。

“同网站”和“跨网站”
架构和 eTLD+1 相同的网站会被视为“同一网站”。架构或 eTLD+1 不同的网站属于“跨网站”。
来源 A | 来源 B | “同网站”还是“跨网站”? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | 跨网站:不同网域 |
https://login.example.com:443 | 同一网站:不同的子网域无关紧要 | |
http://www.example.com:443 | 跨站点:不同的架构 | |
https://www.example.com:80 | 同一网站:不同端口无关紧要 | |
https://www.example.com:443 | 同一网站:完全匹配 | |
https://www.example.com | 同一网站:端口无关紧要 |
“无架构同源”

“同源”的定义已更改为将网址架构纳入到网站中,以防止 HTTP 被用作弱信道。不进行架构比较的旧版“同一网站”概念现在称为“无架构同一网站”。例如,http://www.example.com
和 https://www.example.com
被视为无架构的同网站,但不是同网站,因为只有 eTLD+1 部分才重要,架构不予考虑。
来源 A | 来源 B | “无架构同网站”还是“跨网站”? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | 跨网站:不同网域 |
https://login.example.com:443 | 无架构同一网站:不同子网域无关紧要 | |
http://www.example.com:443 | 无架构同源:不同架构无关紧要 | |
https://www.example.com:80 | 无架构同一网站:不同端口无关紧要 | |
https://www.example.com:443 | 无架构同网站:完全匹配 | |
https://www.example.com | 无架构同一网站:端口无关紧要 |
如何检查请求是“同网站”“同源”还是“跨网站”
所有现代浏览器都会发送包含 Sec-Fetch-Site
HTTP 标头的请求。标头具有以下某个值:
cross-site
same-site
(指 schemeful same-site)same-origin
none
您可以检查 Sec-Fetch-Site
的值,以确定请求是同一网站、同一源还是跨网站请求。
您可以合理地信任 Sec-Fetch-Site
标头的值,因为:
- JavaScript 无法修改以
Sec-
开头的 HTTP 标头 - 浏览器始终会设置这些标题。