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
更加詳細的信息能夠參考這裏:
XMLHttpRequest Level 1
3.中間代理。若是用戶請求要通過一些中間代理(好比運營商或者公司網關),中間代理可以查看和修改用戶的所有數據,任何頭部字段。除非咱們使用了HTTPS。
不一樣的header字段有不一樣的意義,因此生成的依據也不同。我也簡單分一下類:
- 跟用戶請求和用戶屬性相關的,好比host這個字段的值就是你在瀏覽器中輸入的域名或者IP。cookie或者一些其餘數據也是用戶以前訪問時保存在瀏覽器端的,再次訪問時瀏覽器會自動填充這些字段。
- 瀏覽器能力和特性相關的。好比瀏覽器和操做系統的版本,可以支持的字符集,是否支持壓縮等。這些主要包括user-agent, connection, accept相關。
- 安全和協議相關的,好比有Upgrade-Insecure-Requests, hsts, upgrade ,Access-Control-Allow-Origin 等。
上面的分類不太標準,算是我大概羅列的吧。
至於能不能修改http header,個人建議是固然不能隨便修改任何字段。但也有一些狀況:
- 有一些字段是絕對不能修改的,好比最重要的host字段,若是沒有host值,http1.1協議會認爲這是一個不規範的請求從而直接丟棄。一樣的若是隨便修改這個值,好比將騰訊首頁改爲百度一下,你就知道,那目的網站也返回不了正確的內容。user-agent也不建議隨便修改,有不少網站是根據這個字段作內容適配的,好比PC和手機確定是不同的內容。
- 有一些字段可以修改,好比connection,cache-control等。不會影響你的正常訪問,但有可能會慢一點。
- 還有一些字段能夠刪除,好比你不但願網站記錄你的訪問行爲或者歷史信息,你能夠刪除cookie,referfer等字段。
- 固然你也能夠自定義構造任意你想要的字段,通常沒什麼影響,除非header太長致使內容截斷。一般自定義的字段都建議X-開頭。好比X-test: lance。
做者:player gg 連接:https://www.zhihu.com/question/34603729/answer/85911416 來源:知乎 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。