Origin和Host的区别
2024-08 3
Origin
请求头的构成
请求标头 Origin
表示了请求的来源(协议、主机、端口),其格式如下:
Origin: <scheme> "://" <host> [ ":" <port> ]
scheme
:协议,如http
或https
。host
:主机名(域名)。port
:端口号,只有在使用非标准端口时才会包含。
默认端口:
- 如果请求使用的是 HTTP 协议,并且使用默认的端口 80,那么
Origin
头只会包含域名,不会显示端口号。 - 如果请求使用的是 HTTPS 协议,并且使用默认的端口 443,
Origin
头也不会包含端口号。
例如:
Origin: http://www.example.com
Origin: https://www.example.com
非默认端口:
- 如果请求使用的是非标准端口,比如 HTTP 协议使用端口 8080,或者 HTTPS 协议使用端口 8443,
Origin
头会包含这个端口号。
例如:
Origin: http://www.example.com:8080
Origin: https://www.example.com:8443
这个行为与浏览器的实现以及HTTP标准的设计有关,目的是在跨域请求时提供足够的信息来确定请求的来源,但在常见的默认端口情况下,省略端口号是为了简化和统一格式。
Host
请求头的构成
Host 请求头指明了请求将要发送到的服务器主机名和端口号。其格式如下:
Host: <host>[":" <port>]
<host>
: 必需部分,指定域名或IP地址。<port>
: 可选部分,指定端口号。如果使用的是默认端口(80 或 443),通常不包括端口号。
默认端口:
- 如果请求使用的是 HTTP 协议,并且使用默认的端口 80,那么
Host
头只会包含域名,不会显示端口号。 - 如果请求使用的是 HTTPS 协议,并且使用默认的端口 443,
Host
头也不会包含端口号。
例如:
Host: www.example.com
Host: www.example.com
非默认端口:
- 如果请求使用的是非标准端口,比如 HTTP 协议使用端口 8080,或者 HTTPS 协议使用端口 8443,
Origin
头会包含这个端口号。
例如:
Host: www.example.com:8080
Host: www.example.com:8443
在大多数情况下,浏览器和客户端工具会自动处理 Host
头字段的构成,只需要在代理服务器或应用服务器上正确配置该字段即可。
两者的区别
从上述例子中可以看出来,Origin
请求头和Host
的明面上区别主要在于是否有协议上。前者包含协议,后者不包含协议。
而两者在用途上也有一些区别:
Host
主要是用与标识请求的目标主机,当一个服务器托管多个站点(称为虚拟主机)时,服务器使用这个请求头来识别请求应当路由到哪个站点。Origin
通常由浏览器在跨域请求时自动添加,所以不是所有请求都有这个头,主要是用于告诉服务器这个请求来自哪里。在CORS 中,服务器使用这个请求头来确定是否允许跨域请求。
举例来说:
Host
- 当一个浏览器请求
http://www.example.com/index.html
时,它会在请求中包含Host: www.example.com
. - 服务器通过读取 Host 头知道这个请求应当处理
www.example.com
的内容,而不是其他托管在同一 IP 地址上的站点。
Origin
- 假设我们在
https://shop.example.com
上运行的网页,通过 JavaScript 请https://api.payments.com
的数据。 - 浏览器会在请求中添加
Origin: https://shop.example.com
。 - 目标服务器
api.payments.com
使用此信息判断是否允许这个请求。如果允许,它会在响应中添加相应的 CORS 头部。
目录
- 无目录