用浏览器访问网址时,请求头(request header)是根据什么生成的?

作者:helloworlds
链接:https://www.zhihu.com/question/34603729/answer/85911416
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http request header是如何生成的?我们能不能修改?主要有三种情况:

  1. 浏览器自动生成的请求。绝大部分正常用户访问都是这类情况,只要是用户主动输入网址访问时发送的http请求,那这些头部字段都是浏览器自动生成的,比如host,cookie,user-agent, Accept-Encoding:等。
  2. 浏览器插件,javascript脚本增加或者修改的header。JS能够控制浏览器发起请求,也能在这里增加一些header,但是考虑到安全和性能的原因,对JS控制 header的能力做了一些限制,比如host和cookie, user-agent等这些字段,JS是无法干预的。
  • Accept-Charset
  • Accept-Encoding
  • Access-Control-Request-Headers
  • Access-Control-Request-Method
  • Connection
  • Content-Length
  • Cookie
  • Cookie2
  • Date
  • DNT
  • Expect
  • Host
  • Keep-Alive
  • Origin
  • Referer
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • User-Agent
  • Vi

更加详细的信息可以参考这里:XMLHttpRequest Level 1
3.中间代理。如果用户请求要经过一些中间代理(比如运营商或者公司网关),中间代理能够查看和修改用户的全部数据,任何头部字段。除非我们使用了HTTPS。

不同的header字段有不同的意义,所以生成的依据也不一样。我也简单分一下类:

  1. 跟用户请求和用户属性相关的,比如host这个字段的值就是你在浏览器中输入的域名或者IP。cookie或者一些其他数据也是用户之前访问时保存在浏览器端的,再次访问时浏览器会自动填充这些字段。
  2. 浏览器能力和特性相关的。比如浏览器和操作系统的版本,能够支持的字符集,是否支持压缩等。这些主要包括user-agent, connection, accept相关。
  3. 安全和协议相关的,比如有Upgrade-Insecure-Requests, hsts, upgrade ,Access-Control-Allow-Origin 等。

上面的分类不太标准,算是我大概罗列的吧。

至于能不能修改http header,我的建议是当然不能随便修改任何字段。但也有一些情况:

  1. 有一些字段是绝对不能修改的,比如最重要的host字段,如果没有host值,http1.1协议会认为这是一个不规范的请求从而直接丢弃。同样的如果随便修改这个值,比如将腾讯首页改成百度一下,你就知道,那目的网站也返回不了正确的内容。user-agent也不建议随便修改,有很多网站是根据这个字段做内容适配的,比如PC和手机肯定是不一样的内容。
  2. 有一些字段能够修改,比如connection,cache-control等。不会影响你的正常访问,但有可能会慢一点。
  3. 还有一些字段可以删除,比如你不希望网站记录你的访问行为或者历史信息,你可以删除cookie,referfer等字段。
  4. 当然你也可以自定义构造任意你想要的字段,一般没什么影响,除非header太长导致内容截断。通常自定义的字段都建议X-开头。比如X-test: lance。

Guess you like

Origin blog.csdn.net/qq_40146082/article/details/105991432
Recommended