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
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。