Origin和Host的区别

2024-08 3

Origin 请求头的构成

请求标头 Origin 表示了请求的来源(协议、主机、端口),其格式如下:

Origin: <scheme> "://" <host> [ ":" <port> ]
  • scheme:协议,如 httphttps
  • 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 头部。