圖解 HTTP 筆記(六)——HTTP 首部

本章主要講解了 HTTP 首部的結構,已經首部中各字段的用法。css

1、HTTP 報文首部

httpstructure

上圖是 HTTP 請求報文的結構。html

HTTP 請求報文由方法、URI、HTTP 版本、HTTP 首部字段等組成。git

請求報文首部信息實例:github

GET / HTTP/1.1
Host: hackr.jp
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/2010010
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*; q=0
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
If-Modified-Since: Fri, 31 Aug 2007 02:02:20 GMT
If-None-Match: "45bae1-16a-46d776ac"
Cache-Control: max-age=0
複製代碼

HTTP 響應報文由 HTTP 版本、狀態碼(數字和緣由短語)、HTTP 首部字段三部分組成。算法

下圖是 HTTP 響應報文結構:跨域

httpresstructure

響應報文的首部實例:瀏覽器

HTTP/1.1 304 Not Modified
Date: Thu, 07 Jun 2012 07:21:36 GMT
Server: Apache
Connection: close
Etag: "45bae1-16a-46d776ac"
複製代碼

2、HTTP 首部字段

2.1 HTTP 首部字段結構

HTTP 首部字段傳遞重要信息,其結構基本以下:緩存

首部字段名:字段值
複製代碼

例如:安全

Content-Type:text/html
複製代碼

另外,有些首部字段能夠有多個值,以下所示:bash

Keep-Alive:timeout=15,max=100
複製代碼

2.2 HTTP 首部字段類型

HTTP 首部字段根據實際用途被分爲四種類型。

  • 通用首部字段:請求報文和響應報文都會使用到的首部字段。
  • 請求首部字段:從客戶端向服務端發送請求報文時使用的首部。補充了請求的附加內容、客戶端信息、響應內容相關優先級的信息。
  • 響應首部字段:從服務端向客戶端發送響應報文時的首部。補充了響應的附加內容,也會要求客戶端附加的內容信息。
  • 實體首部字段:針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等與實體內容相關的信息。

2.3 HTTP 首部字段一覽

2.3.1 通用首部字段
首部字段名 說明
Cache-Control 控制緩存的行爲
Connection 逐跳首部、鏈接的管理
Date 建立報文的日期時間
Pragma 報文指令
Trailer 報文末尾的首部一覽
Transfer-Encoding 指定報文主體的傳輸編碼方式
Upgrade 升級爲其餘協議
Via 代理服務器的相關信息
Warning 錯誤通知
2.3.2 請求首部字段
首部字段名 說明
Accept 用戶代理可處理的媒體類型
Accept-Charset 優先的字符集
Accept-Encoding 優先的內容編碼
Accept-Language 優先的語言(天然語言)
Authorization Web 信息認證
Expect 期待服務器的特定行爲
From 用戶的電子郵箱地址
Host 請求資源所在的服務器
If-Match 比較實體標記(ETag)
If-Modified-Since 比較資源的更新時間
If-None-Match 比較實體標記(與 If-Match 相反)
If-Range 資源未更新時發送實體 Byte 的範圍請求
If-Unmodified-Since 比較資源的更新時間(與 If-Modified-Since 相反)
Max-Forwards 最大傳輸逐跳數
Proxy-Authorization 代理服務器要求客戶端的認證信息
Range 實體的字節範圍請求
Referer 對請求中 URI 的原始獲取方
TE 傳輸編碼的優先級
User-Agent HTTP 客戶端程序的信息
2.3.3 響應首部字段
首部字段名 說明
Accept-Ranges 是否接受字節範圍請求
Age 推算資源建立通過時間
ETag 資源的匹配信息
Location 令客戶端重定向至指定 URI
Proxy-Authenticate 代理服務器對客戶端的認證信息
Retry-After 對再次發起請求的時機要求
Server HTTP 服務器的安裝信息
Vary 代理服務器緩存的管理信息
WWW-Authenticate 服務器對客戶端的認證信息
2.3.4 實體首部字段
首部字段名 說明
Allow 資源可支持的 HTTP 方法
Content-Encoding 實體主體適用的編碼方式
Content-Language 實體主體的天然語言
Content-Length 實體主體的大小(字節)
Content-Location 替代對應資源的 URI
Content-MD5 實體主體的報文摘要
Content-Range 實體主體的位置範圍
Content-Type 實體主體的媒體類型
Expires 實體主體過時的日期時間
Last-Modified 資源的最後修改時間

以上就是最經常使用的一些 HTTP 首部字段。

其餘還有一些非 HTTP/1.1 規範的首部字段也用的比較多,好比 Set-Cookie、Cookie 等等。

此外,HTTP 首部根據將定義成緩存代理和非緩存代理的行爲,分紅了兩種類型——端到端首部(End-to-End Header)和逐跳首部(Hop-by-Hop Header)。

端到端首部類的首部字段會轉發給請求/響應的最終接受對象,且必須保存在由緩存生成的響應中,另外規定它必須轉發;

逐跳首部只對單次轉發有效,會因經過緩存或代理而再也不轉發。HTTP/1.1 以後的版本中使用逐跳首部須要提供 Connection 首部字段。

下面這些字段都屬於逐跳首部字段:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • Trailer
  • TE
  • Transfer-Encoding
  • Upgrade

全部其他字段皆爲端到端首部字段。

下面開始詳細介紹各個首部字段。

2.4 HTTP/1.1 通用首部字段

2.4.1 Cache-Control

經過指定首部字段 Cache-Control,就能操做緩存的工做機制。

Cache-Control 的指令參數是可選的,多個指令之間經過逗號分開。該首部字段在請求和響應時均可以使用。

Cache-Control: private, max-age=0, no-cache
複製代碼

Cache-Control 可用指令以下:

請求指令:

指令 參數 說明
no-cache 強制向源服務器再次驗證
no-store 不緩存請求或響應的任何內容
max-age=[秒] 必需 響應的最大 age 值
max-stale(=[秒]) 可省略 接受已過時的響應
min-fresh=[秒] 必需 指望在指定的時間內的響應仍然有效
no-transform 代理不可更改媒體類型
only-if-cached 從緩存得到資源
cache-extension - 新指令標記(token)

響應指令:

指令 參數 說明
public 可向任意方提供響應的緩存
private 可省略 僅向特定用戶返回響應
no-cache 可省略 緩存前必須確認其有效性
no-store 不緩存請求或響應的任何內容
no-transform 代理不可更改媒體類型
must-revalidate 可緩存但必須再向源服務器進行確認
proxy-revalidate 要求中間緩存服務器對緩存的響應有效性再進行確認
max-age=[秒] 必需 響應的最大 age 值
s-maxage=[秒] 必需 公共緩存服務器響應的最大 age 值
cache-extension - 新指令標記(token)

規定是否緩存的指令:

public 指令

Cache-Control: public
複製代碼

當指定使用 public 指令時,則明確代表其餘用戶也可利用緩存。

private 指令

Cache-Control: private
複製代碼

當指定 private 指令後響應只以特定的用戶做爲對象,當該對象向服務器發起請求時,服務器會返回緩存的資源。

no-cache 指令

Cache-Control: no-cache
複製代碼

該指令的目的是爲了防止使用過時的緩存資源。

若是客戶端發送的請求中包含 no-cache 指令,則表示客戶端將不會接受過時的緩存過的響應。因而,中間的代理服務器必須把請求轉發給源服務器。

若是服務器返回的響應中包含 no-cache 指令,那麼緩存服務器不能對資源進行緩存,源服務器之後也將再也不對緩存服務器請求中提出的資源有效性進行確認,且禁止其對資源響應進行緩存操做。


控制可執行緩存對象的指令:

no-store 指令

Cache-Control: no-store
複製代碼

當使用 no-store 指令時,暗示請求或響應中包含機密信息。

所以該指令規定緩存不能在本地存儲請求或響應的任一部分。

注意

從字面意義來講,很容易把 no-cache 理解爲不緩存,但事實上 no-cache 表明的是不緩存過時的資源,緩存會向源服務器確認有效性後再處理資源。no-store 纔是真正的不進行緩存。


指定緩存期限和認證的指令:

s-maxage 指令

Cache-Control: smax-age=604800(單位:秒)
複製代碼

該指令功能和 max-age 相同,不一樣點是 s-maxage 指令只適合於供多位用戶使用的公共緩存服務器。

當使用 smax-age 指令以後,直接會忽略 Expires 字段及 max-age 指令的處理。

max-age 指令

Cache-Control: max-age=604800(單位:秒)
複製代碼

當客戶端發送的請求中包含 max-age 指令時,若是斷定緩存資源的緩存時間數值比指定的數值更小,那麼客戶端就接收緩存的資源。另外,當指定 max-age 值爲 0,那麼緩存服務器一般須要將請求轉發給源服務器(至關因而 no-cache)。

當服務器返回的響應中包含 max-age 指令時,緩存服務器將不對資源的有效性再作確認,而 max-age 數值表明的是資源保存爲緩存的最長時間。

應用 HTTP/1.1 版本的緩存的服務器遇到同時存在 Expires 首部字段的狀況時,會優先處理 max-age 指令,而忽略掉 Expires 首部字段。而應用 HTTP/1.0 版本的服務器則偏偏相反

min-fresh 指令

Cache-Control: min-fresh=60(單位:秒)
複製代碼

min-fresh 指令要求緩存服務器返回至少還未過指定時間的緩存資源(即指定時間事後仍然是未過時的資源)。

max-stale 指令

Cache-Control: max-stale=3600(單位:秒)
複製代碼

使用 max-stale 表示接受過時的緩存資源,後面的值表示具體過時的時長,表示響應不能已通過時超過該給定的時間。若是不傳遞數值,則表示不管通過多久,客戶端都可以接受。

only-if-cached 指令

Cache-Control: only-if-cached
複製代碼

使用該指令表示客戶端僅在緩存服務器本地緩存目標資源的狀況下才會要求其返回。即只接受已緩存的資源,而且不用向源服務器檢查資源的有效性。若代理服務器本地緩存無響應,則返回 504 Gateway Timeout。

must-revalidate 指令

Cache-Control: must-revalidate
複製代碼

使用該指令,代理會向源服務器再次驗證即將返回的響應緩存目前是否仍然有效。

使用 must-revalidate 指令會忽略 max-stale 指令。

proxy-revalidate 指令

Cache-Control: proxy-revalidate
複製代碼

該指令要求全部的緩存服務器在接收到客戶端帶有該指令的請求返回響應以前,必須再驗證資源的有效性。

no-transform 指令

Cache-Control: no-transform
複製代碼

該指令規定不管在請求仍是響應中緩存都不能改變實體的媒體類型。

這樣能夠防止緩存或者代理壓縮圖片等相似操做。

2.4.2 Connection

這個首部字段有一下兩個做用:

  • 控制再也不轉發給代理的首部自擔
  • 管理持久鏈接
Connection: 再也不轉發的首部字段名
複製代碼

這條語句就表示指定的首部字段再也不轉發到下一級服務器(多是代理)。

httpconn

除了上面的功能之外,該首部還能夠管理持久鏈接:

Connection: close
複製代碼

該指令明確指定斷開當前鏈接。(HTTP/1.1 的全部鏈接默認都是長鏈接)

Connection: keep-alive
複製代碼

以上指令明確指定當前鏈接爲長鏈接。(適用於 HTTP/1.1 版本以前)

2.4.3 Date

該字段代表 HTTP 報文建立的日期和時間。

Date: Tue, 03 Jul 2012 04:40:59 GMT
複製代碼
2.4.4 Pragma

該字段是 HTTP/1.1 版本的遺留字段,爲了向後兼容而定義。

Pragma: no-cache
複製代碼

Cache-Control: no-cache
複製代碼

功能一致。

2.4.5 Trailer

該字段事先說明在報文主體後記錄了哪些首部字段,可用於 HTTP/1.1 版本分塊傳輸編碼時。

2.4.6 Transfer-Encoding

該首部字段指定了在傳輸報文主體時所使用的編碼方式。

Transfer-Encoding: chunked
複製代碼
2.4.7 Upgrade

該首部字段用於檢測 HTTP 協議及其餘協議是否能夠升級爲更高版本進行通訊,其參數值能夠用來指定一個徹底不一樣的通訊協議。

2.4.8 Via

該首部字段是爲了追蹤客戶端與服務器之間的請求和響應報文的傳輸路徑。

報文通過代理或者網關時,會在首部字段 Via 中附加該服務器的信息,而後再進行轉發。並且這個字段不只能夠用於追蹤報文的轉發,還能夠避免請求迴環發生。

httpvia

各個代理服務器會向 Via 添加自身服務器的信息。

其中 1.0 以及 1.1 的開頭表示服務器的 HTTP 協議版本。

2.4.9 Warning

該首部自擔一般告訴用戶一些緩存相關的問題的警告,具體格式以下:

Warning: [警告碼][警告的主機:端口號]「[警告內容]」([日期時間])
複製代碼

具體警告碼能夠查閱《圖解 HTTP》表 6-7。

2.5 請求首部字段

請求首部字段是從客戶端發往服務器端時請求報文中所使用的字段。

2.5.1 Accept
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
複製代碼

該首部字段能夠通知服務器,用戶代理可以處理的媒體類型及媒體類型的相對優先級。可使用 type/subtype 的形式一次指定多種媒體類型。

經常使用媒體類型:

  • 文本文件:

    text/html,text/plain,text/css,application/xhtml+xml,application/xml...
    複製代碼
  • 圖片文件

    image/jpg,image/gif,image/png...
    複製代碼
  • 視頻文件

    video/mpeg,video/quicktime...
    複製代碼
  • 應用程序使用的二進制文件

    application/octet-stream,application/zip...
    
    複製代碼

多個協議之間使用逗號分隔,分號以前表明媒體類型,分號以後表明權重。

當服務器提供多種內容時,會首先返回權重最高的媒體類型。

2.5.2 Accept-Charset
Accept-Charset: iso-8859-5,unicode-1-1;q=0.8

複製代碼

該字段可用來通知服務器用戶代理支持的字符集以及字符集的權重。

2.5.3 Accept-Encoding
Accept-Encoding: gzip,deflate

複製代碼

該字段用來告知服務器用戶代理支持的內容編碼及內容編碼格式的優先級。

如下是最經常使用的幾個內容編碼格式:

  • gzip

    由文件壓縮程序 gzip(GNU zip)生成的編碼格式(RFC1952)。

  • compress

    由 UNIX 文件壓縮程序 compress 生成的編碼格式。

  • deflate

    組合使用 zlib 格式及有 deflate 壓縮算法生成的編碼格式。

  • identity

    不執行壓縮或者不會變化的默認編碼格式。

2.5.4 Accept-Language

告知服務器可以處理的天然語言。

Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

複製代碼
2.5.5 Authorization

該字段用於告知服務器用戶代理的認證信息。

Authorization: Basic dWVub3NlbjpwYXNzd29yZA==

複製代碼
2.5.6 Expect
Expect: 100-continue

複製代碼

客戶端使用該字段來告知服務器指望出現的某種特定行爲。

若是服務器沒法理解這種特定的行爲,則會返回 417 Expectation Failed的錯誤。

2.5.7 From
From: info@hackr.jp

複製代碼

該字段用來告知服務器使用用戶代理的用戶電子郵箱地址。

2.5.8 Host
Host: www.hackr.jp

複製代碼

不少時候一臺服務器上部署了多個網站,對應着多個域名,當 DNS 解析到服務器以後,咱們須要知道用戶訪問的是哪一個網址,以便分配到對應的端口給對應的程序進行處理,因此 Host 就用來告知服務器端用戶訪問的主機名稱和端口號。

Host 首部是惟一一個必須被包含在請求內的首部字段。

若是服務器未設定主機名,那麼發送一個空值便可。

2.5.9 If-Match

形如 If-xxx 的請求首部字段,均可以稱爲條件請求。服務器接收到條件請求以後,只有在判斷條件爲真時纔會執行請求。

If-Match: "123456"

複製代碼

該首部字段屬於附帶條件之一,它會告知服務器匹配資源所用的實體標記(ETag,後面會講)值。服務器會比對 If-Match 的字段值和資源的 ETag 值,僅當二者一致時纔會執行請求。反之會返回狀態碼 412 Precondition Failed 的響應。

使用 * 時,服務器會匹配任意的 ETag 值。

2.5.10 If-Modified-Since

該首部字段指定一個時間點,若是在該時間點以後有修改過資源,則會響應請求。

If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT

複製代碼

若是在這個時間點以後沒有修改過資源,則返回 304 Not Modified 狀態碼的響應。

2.5.11 If-None-Match

該字段與 If-Match 的做用相反。當該字段的值不匹配資源的 ETag 時纔會響應請求。

2.5.12 If-Range

該字段的值如果跟 ETag 的值或更新的日期時間相匹配,那麼就做爲範圍請求處理;若是沒法匹配的話就返回全體資源。

2.5.13 If-Unmodified-Since
If-Unmodified-Since: Thu, 03 Jul 2012 00:00:00 GMT

複製代碼

該首部字段和 If-Modified-Since 做用相反,它的做用是告知服務器指定的資源只有在指定日期以後沒有發生變動的狀況下才處理請求,不然就返回 412 Precondition Failed 狀態碼。

2.5.14 Max-Forward

經過 TRACE 方法或者 OPTIONS 方法發送包含首部字段 Max-Forward 的請求時,該字段以十進制整數形式指定可通過的服務器的最大數目。

Max-Forward: 10

複製代碼
2.5.15 Proxy-Authorization
Proxy-Authorization: Basic dGlwObjkNLAGFfY5

複製代碼

該字段告知服務器認證所須要的信息,該認證行爲發生在客戶端與代理服務器之間。

2.5.16 Range
Range: bytes=5001-10000

複製代碼

該字段適用於只獲取部分資源的範圍請求,它告知了服務器所須要的服務器資源的指定範圍。

接收到攜帶該字段請求的服務器會返回狀態碼爲 206 Partial Content 的響應,若是沒法處理該範圍請求,則服務器會返回狀態碼爲 200 OK 的響應以及所有資源。

2.5.17 Referer
Referer: http://www.hackr.jp/index.htm

複製代碼

該首部字段告知服務器請求的原始資源的 URI。

根據這個字段,服務器能夠知道當前請求是從哪一個地址跳轉過來的,更多關於 Referer 的內容能夠閱讀阮一峯老師的博客:HTTP Referer 教程

2.5.18 TE
TE:gzip,deflate;q=0.5

複製代碼

該字段會告知服務器客戶端可以處理的響應的傳輸編碼方式及相對的優先級,其功能和 Transfer-Encoding 的功能相似。

2.5.19 User-Agent
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1

複製代碼

該字段會將建立請求的瀏覽器和用戶代理名稱的相關信息發送給服務器。當爬蟲發起請求時,有可能會在該字段添加做者的地址。

值得一提的是有些網站會作出反爬蟲策略,他們會驗證 User-Agent 字段是否來自於瀏覽器,若是不是的話就會拒絕爬蟲的請求;因此若是要想繼續拿到想要的信息的話就會經過該字段將爬蟲僞形成瀏覽器。

2.6 響應首部字段

響應首部字段是由服務器端向客戶端返回響應報文中所使用的字段,用於補充響應的附加信息、服務器信息,以及對客戶端的附加要求信息等。

2.6.1 Accept-Ranges
Accept-Ranges: bytes

複製代碼

該字段用於告知客戶端服務器是否能處理範圍請求,以指定獲取服務器端某個部分的資源。當服務器可以處理客戶端的範圍請求時,其值爲 bytes,反之爲 none。

2.6.2 Age
ETag: 600

複製代碼

該首部字段告知客戶端源服務器在多久以前建立了響應,字段的值的單位爲秒。

若建立該響應的服務器是緩存服務器,Age 值是指緩存後的響應再次發起認證到再次認證完成的時間值。

2.6.3 ETag
ETag: "82e22293907ce725faf67773957acd12"

複製代碼

首部字段 ETag 能告知客戶端實體標誌。它是一種可以將資源以字符串形式作惟一性標誌的方式。服務器會爲每份資源分配對應的 ETag 值。

當資源更新時,ETag 值也要更新。完成 ETag 值時,並無統一的算法規則,僅僅由服務器分配。

訪問某個資源的 URI 通常不會發生改變,可是當資源自己發生了變化時,資源對應的 ETag 也會更新。

強 ETag 和弱 ETag

ETag 值有強弱之分,強 ETag 值無論資源發生多麼細微的變化都會隨之變化,而弱 ETag 值只有在資源發生了根本改變併產生差別時纔會發生變化。

2.6.4 Location
Location: http://www.usagidesign.jp/sample.html

複製代碼

該首部字段能夠將接受響應的客戶端引導到某一個與其請求 URI 位置不一樣的資源。

基本上該字段會配合 3xx 重定向狀態碼一塊兒使用。

2.6.5 Proxy-Authenticate
Proxy-Authenticate: Basic realm="Usagidesign Auth"

複製代碼

該首部字段會把代理服務器所要求的認證信息發送給客戶端。

2.6.6 Retry After
Retry-After:120

複製代碼

該首部字段告知客戶端在多久以後再次發起請求。該字段能夠指定爲具體的時間或者建立響應後的秒數。

2.6.7 Server

該首部字段會告知客戶端當前服務器上安裝的 HTTP 服務器應用程序的信息。

Server: Apache/2.2.17 (Unix)

複製代碼
2.6.8 Vary
Vary: Accept-Language

複製代碼

該首部字段可對緩存進行控制,源服務器會向代理服務器傳達關於本地緩存使用方法的命令。

具體來講,該首部字段會指定一個其餘的首部字段,好比上面的 Accept-Encoding,當指定字段的值未發生變化時,則使用緩存資源;若是指定字段的值發生了變化時,則須要向源服務器請求最新的資源。

這個字段能夠指定 User-Agent,防止移動端瀏覽器訪問頁面時訪問了 PC 端頁面的緩存。

當該字段指定爲 * 時,全部的請求都會被視爲惟一的而且會被緩存。

2.6.9 WWW-Authenticate
WWW-Authenticate: Basic realm="Usagidesign Auth"

複製代碼

該首部字段用於 HTTP 訪問認證。

2.7 實體首部字段

實體首部字段是包含在請求報文和響應報文中的實體部分所使用的首部,用於補充內容的更新時間和實體相關的信息。

2.7.1 Allow
Allow:GET,HEAD

複製代碼

該首部字段用於通知客戶端服務器可以支持的 HTTP 方法,當服務器接收到不支持的請求方法時,會返回 405 Not Allowed 狀態碼。

2.7.2 Content-Encoding
Content-Encoding:gzip

複製代碼

該首部字段會告知客戶端對實體的主體部分所使用的內容編碼格式。

具體編碼格式能夠參考 2.5.3 Accept-Encoding。

2.7.3 Content-Language
Content-Language:zh-CN

複製代碼

該首部字段用於通知客戶端實體主體所使用的天然語言。

2.7.4 Content-Length
Content-Length:15000

複製代碼

該首部字段代表了實體主體的大小(單位是字節)。

若是對實體主體採用了內容編碼傳輸時,不能再使用 Content-Length 首部字段。

2.7.5 Content-Location
Content-Location:http://www.hackr.jp/index-ja.html

複製代碼

該首部字段給出與報文主體相對應的 URI。當返回的頁面內容與請求的實際對象不相同時,首部字段 Content-Location 會寫明 URI。

2.7.6 Content-MD5
Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==

複製代碼

客戶端會對接收到的報文主體採用 MD5 算法進行散列計算,而後與 Content-MD5 的值進行比較以對接收到的主體內容進行完整性校驗。

散列算法進行計算的作法主要用於防止傳輸內容被篡改,由於同一個輸入經過散列算法計算之後獲得的結果是相同的,不一樣的輸入通過散列算法計算以後獲得的結果基本不會重複。這也是許多提供資源下載的網站同時會給出資源對應 HASH 值的緣由。

可是 Content-MD5 並不可靠,由於若是傳輸主體的內容能夠被修改的話,Content-MD5 的值一樣也可能被修改過,因此並不可靠。爲了確保資源不被篡改,最好仍是使用 HTTPS。

2.7.7 Content-Range
Content-Range: bytes 5001-10000/10000

複製代碼

針對範圍請求,該首部字段告知客戶端返回的響應的實體的哪些部分符合範圍請求,單位爲字節。

2.7.8 Content-Type
Content-Type: text/html; charset=UTF-8

複製代碼

該首部字段說明了實體主體內的媒體類型。

2.7.9 Expires
Expires: Wed, 04 Jul 2012 08:26:05 GMT

複製代碼

該首部字段將資源失效的日期告知客戶端。

當首部字段 Cache-Control 有指定 max-age 指令時,會優先處理 max-age 指令。

2.7.10 Last-Modified
Last-Modified: Wed, 23 May 2012 09:59:55 GMT

複製代碼

該首部字段指明瞭資源的最終修改時間。

2.8 爲 Cookie 服務的首部字段

Cookie 的工做機制是用戶識別及狀態管理

爲 cookie 服務的首部字段:

首部字段名 說明 首部類型
Set-Cookie 開始狀態管理所使用的 Cookie 信息 響應首部字段
Cookie 服務器接收到的 Cookie 信息 請求首部字段
2.8.1 Set-Cookie

當服務器開始準備管理客戶端的狀態時,會實現告知各類信息。

下面的表格列舉了 Set-Cookie 的字段值。

屬性 說明
NAME=VALUE 賦予 Cookie 的鍵和對應值
expires=DATE Cookie 的有效期
path=PATH 將服務器上的文件目錄做爲 Cookie 的適用對象(若不指定則默認爲文檔所在的文件目錄)
domain=域名 做爲 Cookie 適用對象的域名(若不指定則默認爲建立 Cookie 的服務器的域名)
Secure 僅在 HTTPS 安全通訊時才發送 Cookie
HttpOnly 加以限制,使 Cookie 不能被 JavaScript 所訪問

下面詳細講講 Cookie 的各個屬性。

  • expires:該屬性指定瀏覽器能夠發送 Cookie 的有效期。當省略 expires 屬性時,其有效期僅限於維持瀏覽器會話(Session)時間段內。這一般限於瀏覽器關閉以前。

    另外須要注意的是一旦 Cookie 從服務器端發送到客戶端,服務器端就不存在能夠顯式刪除 Cookie 的方法。只能經過覆蓋已有的 Cookie 來達到刪除的目的。

  • path:該屬性用於限定指定 Cookie 的發送範圍的文件目錄。可是有其餘辦法能夠避開這個限制,因此不要對它抱有太大指望。

  • domain:該屬性的域名可作到與結尾匹配一致,好比指定 domain 爲 example.com,此時 www.example.com 和 www2.example.com 也均可以訪問 Cookie。因此不指定域名的狀況下更加安全,由於默認只有當前響應的服務器的域名能夠訪問 Cookie。

  • secure:該屬性限制 Web 頁面僅在 HTTPS 安全鏈接時才發送 Cookie。當省略該屬性時,HTTP 和 HTTPS 協議的指定域名均可以訪問 Cookie。

  • HttpOnly:該屬性使得 JavaScript 沒法對 Cookie 進行讀取操做。

2.8.2 Cookie
Cookie:status=enable

複製代碼

首部字段 Cookie 會告知服務器,當客戶端想要得到 HTTP 狀態管理的支持時,就會在請求中包含從服務器中獲取到的 Cookie。

2.9 其餘首部字段

HTTP 首部字段是能夠自行擴展的,因此在 Web 服務器和瀏覽器的應用上,會出現一些非標準的首部字段。

下面是比較經常使用的非標準首部字段:

  • X-Frame-Options
  • X-XSS-Protection
  • DNT
  • P3P
2.9.1 X-Frame-Options
X-Frame-Options: DENY

複製代碼

該首部字段屬於 HTTP 響應首部,用於控制網站內容在其餘 Web 網站的 Frame 標籤內的顯示問題。其主要目的是防止點擊劫持攻擊(clickjacking)。

此處的 Frame 包括 iframe、frame、object 等標籤

該字段能夠指定三類值:

  • DENY:拒絕被嵌套到 Frame,即便是相同域名下的頁面也不行
  • SAMEORIGIN:該頁面只能夠被嵌入到相同域名頁面的 Frame 中
  • ALLOW-FROM uri:表示能夠在指定來源的頁面中被嵌套
2.9.2 X-XSS-Protection

該字段屬於響應首部,是針對跨域腳本攻擊的一種策略,用於控制瀏覽器 XSS 防禦機制的開關。

該字段能夠設置一下了兩個值:

  • 0:將 XSS 過濾設置成無效狀態
  • 1:將 XSS 過濾設置成有效狀態
2.9.3 DNT
DNT:1

複製代碼

該首部字段屬於 HTTP 請求首部,其中 DNT 是 Do Not Track 的簡稱,表示拒絕我的信息被收集。

0 表示贊成被追蹤,1 表示拒絕被追蹤。

2.9.4 P3P

該首部字段屬於響應首部,經過利用 P3P 技術讓網站上的我的隱私變成僅供程序可理解的形式。

相關文章
相關標籤/搜索