http request header是如何生成的?我们能不能修改?主要有三种情况:
- 浏览器自动生成的请求。绝大部分正常用户访问都是这类情况,只要是用户主动输入网址访问时发送的http请求,那这些头部字段都是浏览器自动生成的,比如host,cookie,user-agent, Accept-Encoding:等。
- 浏览器插件,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
- 跟用户请求和用户属性相关的,比如host这个字段的值就是你在浏览器中输入的域名或者IP。cookie或者一些其他数据也是用户之前访问时保存在浏览器端的,再次访问时浏览器会自动填充这些字段。
- 浏览器能力和特性相关的。比如浏览器和操作系统的版本,能够支持的字符集,是否支持压缩等。这些主要包括user-agent, connection, accept相关。
- 安全和协议相关的,比如有Upgrade-Insecure-Requests, hsts, upgrade ,Access-Control-Allow-Origin 等。
- 有一些字段是绝对不能修改的,比如最重要的host字段,如果没有host值,http1.1协议会认为这是一个不规范的请求从而直接丢弃。同样的如果随便修改这个值,比如将改成,那目的网站也返回不了正确的内容。user-agent也不建议随便修改,有很多网站是根据这个字段做内容适配的,比如PC和手机肯定是不一样的内容。
- 有一些字段能够修改,比如connection,cache-control等。不会影响你的正常访问,但有可能会慢一点。
- 还有一些字段可以删除,比如你不希望网站记录你的访问行为或者历史信息,你可以删除cookie,referfer等字段。
- 当然你也可以自定义构造任意你想要的字段,一般没什么影响,除非header太长导致内容截断。通常自定义的字段都建议X-开头。比如X-test: lance。