HTTP 標頭欄位(headers)
當你寄出一個包裹時,箱子裡裝著內容物,但外面的標籤帶著額外指示:寄件人是誰、有多易碎、是否需要冷藏。HTTP 標頭(header)就是那張標籤。它們是一行行的中介資料(metadata),位在請求行或狀態行與主體之間,用來描述這則訊息、並形塑對方該如何處置它——而本身並不屬於你所要的真正內容。
每個標頭都是一行簡單的「名稱: 值」,而一則請求或回應可以攜帶許多個。在請求上,瀏覽器可能會送出「Host: example.com」(指哪個站台,因為一台伺服器可代管許多)、「User-Agent: ...」(我是哪一種用戶端)、「Accept: text/html」(我能處理的格式)、「Cookie: ...」(先前留下的狀態)以及「Authorization: ...」(憑證)。在回應上,伺服器會送出像「Content-Type: image/jpeg」(如何解讀主體)、「Content-Length: 50831」(共幾個位元組)、「Set-Cookie: ...」(請記住這個)以及各種快取指示。一個空行標示著標頭結束、主體開始。
標頭正是 HTTP 大半巧思之所在。內容協商(content negotiation,給你偏好的語言或格式)、快取、Cookie 與會話、身分驗證、壓縮,以及條件式請求(「只有變動了才送來」),全都由標頭驅動,而非靠改動主體或方法。它們在設計上是可擴充的:伺服器與用戶端可以約定一個新標頭而不影響其他人,因為一方若看不懂某個標頭,照規定就應該忽略它。這就是為什麼新的網頁功能能在不推出新版 HTTP 的情況下逐步上線。
你的瀏覽器請求一篇文章,並附上「Accept-Language: fr」。伺服器讀到這個標頭,便回傳法文版本,附上「Content-Language: fr」與「Content-Type: text/html; charset=utf-8」。頁面內容(主體)是那篇文章;而是標頭協商出「給哪一篇」以及「如何呈現」。
標頭是信封上的指示,主體是裡頭的東西。HTTP 大多數功能都搭載在標頭上。
標頭名稱不分大小寫(Content-Type 等同 content-type),但值區分大小寫——而且永遠別盲目信任用戶端送來的標頭,因為請求標頭裡的任何東西(包括 User-Agent,甚至看似的來源)都可能被傳送方偽造。