HTTP request header:host, referer, origin的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP request header:host, referer, origin的区别相关的知识,希望对你有一定的参考价值。

参考技术A

请求头指明了请求将要发送到的服务器主机名和端口号。

如果没有包含端口号,会自动使用被请求服务的默认端口(比如HTTPS URL使用443端口,HTTP URL使用80端口)。

所有HTTP/1.1 请求报文中必须包含一个 Host 头字段。对于缺少 Host 头或者含有超过一个 Host 头的HTTP/1.1 请求,可能会收到 400 (Bad Request)状态码。

例如:Host: developer.cdn.mozilla.net

指定要访问的服务器主机名和端口号

Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

需要注意的是 referer 实际上是 "referrer" 误拼写。参见 HTTP referer on Wikipedia (HTTP referer 在维基百科上的条目)来获取更详细的信息。

Referer 请求头可能暴露用户的浏览历史,涉及到用户的隐私问题。

在以下两种情况下, Referer 不会被发送:

例如:

请求首部字段 Origin 指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。该首部用于 CORS 请求或者 POST 请求(MDN中这样写,但是我试了patch/delete方法也会发送origin)。除了不包含路径信息,该字段与 Referer 首部字段相似。

例如:Origin: https://developer.mozilla.org
组成:协议+域名+端口号
注意:只有跨域请求(可以看到 response 有对应的 header:Access-Control-Allow-Origin),或者同域时发送post请求,才会携带origin请求头。
如果浏览器不能获取请求源,那么 origin 满足上面情况也会携带,不过其值为null。
而referer不论何种情况下,只要浏览器能获取到请求源都会携带。如果浏览器如果不能获取请求源,那么请求头中不会携带referer。

用于 CORS: 当我们的浏览器发出跨站请求时,服务器会校验当前请求是不是来自被允许的站点。服务器就是通过 Origin 字段的值来进行判断。

https://juejin.im/post/6844903954455724045#heading-0
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Origin
https://www.ruanyifeng.com/blog/2016/04/cors.html

以上是关于HTTP request header:host, referer, origin的区别的主要内容,如果未能解决你的问题,请参考以下文章

Fiddler实战之请求头(request headers)和响应头(response headers)

HTTP报文结构和内容(转)

HTTP请求报文和响应报文

HTTP请求报文和响应报文

python requests headers自定义问题

Python asyncio http 请求模块