1. 程式人生 > >HTTP 304狀態碼的詳細講解

HTTP 304狀態碼的詳細講解

HTTP 304態碼詳細講

304態碼應該認為是一種錯誤,而是端有存情況下服端的一種響  

整個求響應過程如下:

端在求一個檔案的候,發現自己存的檔案有 Last Modified ,那麼在求中會包含 If Modified Since 時間就是存檔案的 Last Modified 。因此,如果求中包含 If Modified Since,就明已存在客端。服端只要判斷時間和當前求的檔案的修改時間就可以確定是返回 304 還是 200 對於靜態檔案,例如:CSS片,服器會自完成 Last Modified If Modified Since

的比,完成存或者更新。但是動態頁面,就是動態產生的面,往往沒有包含 Last Modified 資訊,這樣瀏覽器、閘道器等都不會做存,也就是在每次求的候都完成一個 200 求。因此,動態頁面做存加速,首先要在 Response HTTP Header 中增加 Last Modified ,其次根據 Request 中的 If Modified Since 和被求內容的更新時間來返回 200 或者 304 然在返回 304 候已做了一次資料庫查詢,但是可以避免接下來更多的資料庫查詢,並且沒有返回面內容而只是一個 HTTP Header,從而大大的降低頻寬的消耗,
於用的感也是提高。當存有效的候,通 Fiddler HttpWatch 檢視一個請求會得到這樣的結果

第一次訪問 200F5重新整理(第二次訪問) 304Ctrl+F5強制重新整理 200

下面用Fiddler來檢視上面的訪問請求過程

第一次(首次)訪問 200

第二次F5重新整理訪問 304

請求的頭資訊裡多了 “If-Modified-Since","If-None-Match"   

第三次Ctrl+F5強制重新整理 200同第一次,不貼圖

為什麼要使用條件請求當用戶訪問一個網頁時,條件求可以加速網的開啟時間(可以省去傳輸整個響體的時間),

但仍然會有網,為瀏覽是得每個源生成一條條件,並且等到服器返回HTTP/304,才能存來示網.更理想的情況是,器在響上指定Cache-ControlExpires指令,這樣客戶端就能知道該資源的可用時間為多長,也就能跳條件求的步,直接使用存中的源了.可是,即使服器提供了些資訊,在下列情況下仍然需要使用條件:

在超器指定的時間之後如果用戶執行了重新整理操作的在上節給出的片中,請求頭中包含了一個Pragma: no-cache.這是由於使用者使用F5重新整理了網.如果用按下了CTRL-F5 (稱之強刷-hard refresh”),你會發現瀏覽器省略了If-Modified-SinceIf-None-Match請求頭,也就是無條件的面中的每個.避免條件通常來,快取是個好東西.如果你想提高自己網站的訪問速度,快取是必須要考慮的.可是在除錯,候需要阻止,這樣才能確保你所訪問到的資源是最新的.你也會有個疑:“如果不改網站內容,我怎麼才能Fiddler不返回304而返回一個包含響體的HTTP/200?”你可以在Fiddler中的網(Web Sessions)列表中選擇一條響應為HTTP/304的會,然後按下U.Fiddler將會無條件重(Unconditionally reissue)這個請求.然後使用命compare命令比一下兩個求有什麼不同,對比結果如下,從中可以得知,Fiddler是通省略條件實現求的:Screenshot of Windiff of conditional and unconditional requests如果你想全域性阻止HTTP/304,可以麼做:首先清除瀏覽器的,可以使用Fiddler工具上的Clear Cache(僅能清除Internet Explorer快取),或者在瀏覽器上按CTRL+SHIFT+DELETE(所有瀏覽器都支援).在清除瀏覽器的存之後,回到Fiddler,在菜選擇Rules > Performance > Disable Caching選項,然後Fiddler就會:刪除所有請求中的條件求相同的以及所有響中的時間相關的響應頭.此外,還會在每個請求中新增Pragma: no-cache請求頭,在每個響中新增Cache-Control: no-cache應頭,阻止瀏覽.  

動態網頁如何設定304

aspx頁面為例,程式碼如下:

  1. var request = context.Request;
  2.             var response = context.Response;
  3.             if (request.Headers["If-Modified-Since"].NotNullOrEmpty() || request.Headers["If-None-Match"].NotNullOrEmpty())
  4.             {
  5.                 response.StatusCode = 304;
  6.                 return;
  7.             }
  8. //304情況下的操作
  9. //設定快取選項
  10.             response.Clear();
  11.             response.ClearContent();
  12.             response.Headers["Last-Modified"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  13.             response.Headers["ETag"] = id;//這裡假設的是根據不同的id
  14.             response.CacheControl = "private";
  15.             response.ExpiresAbsolute = DateTime.Now.AddMonths(6);

ETag是什麼意思?HTTP 協議規格說明定義ETag量的另一種法是,ETag是一個可以與Web資源關聯的記號(token)。典型的Web資源可以一個Web頁,但也可能是JSONXML文件。服負責判斷號是什麼及其含,並在HTTP應頭中將其送到客

asp.net web api實現如下:

  1. // GET /images/001.png
  2. [HttpGet]
  3. public HttpResponseMessage Get(string filename)
  4. {
  5.         HttpResponseMessage response = new HttpResponseMessage(); 
  6.         .....
  7.         string etag = string.Format("\"{0}\"", fileInfo.MD5);
  8.         var tag = Request.Headers.IfNoneMatch.FirstOrDefault();
  9.         if (Request.Headers.IfModifiedSince.HasValue && tag != null && tag.Tag == etag)
  10.         {
  11.                response.StatusCode = HttpStatusCode.NotModified;
  12.         }
  13.         else
  14.         {
  15.                //dealcode ......
  16.                responseStream.Position = 0;
  17.                response.StatusCode = fullContent ? HttpStatusCode.OK : HttpStatusCode.PartialContent;
  18.                response.Content = new StreamContent(responseStream);
  19.                response.Content.Headers.ContentType = new MediaTypeHeaderValue(fileInfo.ContentType);
  20.                response.Headers.ETag = new EntityTagHeaderValue(etag);
  21.                response.Headers.CacheControl = new CacheControlHeaderValue();
  22.                response.Headers.CacheControl.Public = true;
  23.                response.Headers.CacheControl.MaxAge = TimeSpan.FromHours(480);
  24.                response.Content.Headers.Expires = DateTimeOffset.Now.AddDays(20);
  25.                response.Content.Headers.LastModified = fileInfo.UploadDate;
  26.         }
  27.         return response;
  28. }

態碼

一些常見的狀態碼為:

  • 200 – 器成功返回網
  • 404 – 請求的網頁不存
  • 503 – 器超

下面提供 HTTP 狀態碼的完整列表。點選連結可瞭解詳情。您也可以訪問

1xx(臨時響應)表示臨時響應並需要請求者繼續執行操作的狀態碼。

100繼續

請求者應當繼續提出請求。伺服器返回此程式碼表示已收到請求的第一部分,正在等待其餘部分

101(切換協議

請求者已要求伺服器切換協議,伺服器已確認並準備切換

2xx (成功)

表示成功處理了請求的狀態碼。

200(成功)

器已成功理了求。通常,表示服器提供了求的網。如果是您的 robots.txt 檔案示此狀態碼表示 Googlebot 已成功索到檔案。

201(已建)

請求成功並且伺服器建立了新的資源

202(已接受)

器已接受求,但尚未理。

203(非授資訊)

器已成功理了求,但返回的資訊可能來自另一來源。

204(無內容)

器成功理了求,但沒有返回任何內容。

205(重置內容)

器成功理了求,但沒有返回任何內容。與 204 不同,此響要求求者重置文件檢視(例如,清除表內容以入新內容)。

206(部分內容)

器成功理了部分 GET 請求

3xx (重定向)要完成請求,需要進一步操作。通常,這些狀態碼用來重定向。Google 建議您在每次請求中使用重定向不要超過 5 次。您可以使用網站管理員工具檢視一下 Googlebot 在抓取重定向網頁時是否遇到問題。診斷下的網路抓取頁列出了由於重定向錯誤導致 Googlebot 無法抓取的網址。

300(多種選擇

針對請求,伺服器可執行多種操作。伺服器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇

301(永久移

請求的網頁已永久移動到新位置。伺服器返回此響應(對 GET HEAD 請求的響應,會自求者到新位置。您使用此代 Googlebot 某個網或網站已永久移到新位置。

302臨時

器目前從不同位置的網應請求,但求者應繼續使用原有位置來響以後的求。此代與響 GET HEAD 請求的 301 碼類似,會自求者到不同的位置,但您不使用此代來告 Googlebot 某個網或網站已,因 Googlebot 繼續抓取原有位置並制索引。

303看其他位置)

請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,伺服器返回此程式碼。對於除 HEAD 之外的所有求,服器會自動轉到其他位置。

304(未修改)

自從上次請求後,請求的網頁未修改過。伺服器返回此響應時,不會返回網頁內容。

如果網頁自請求者上次請求後再也沒有更改過,您應將伺服器配置為返回此響應(稱為 If-Modified-Since HTTP 標頭)。伺服器可以告訴 Googlebot 自從上次抓取後網頁沒有變更,進而節省頻寬和開銷。

305(使用代理)

請求者只能使用代理訪問請求的網頁。如果服器返回此響表示求者使用代理。

307臨時重定向)

器目前從不同位置的網應請求,但求者應繼續使用原有位置來響以後的求。此代與響 GET HEAD 請求的 <a href=answer.py?answer=>301</a> 碼類似,會自求者到不同的位置,但您不使用此代來告 Googlebot 某個面或網站已,因 Googlebot 繼續抓取原有位置並制索引。

4xx(請求錯誤)這些狀態碼錶示請求可能出錯,妨礙了伺服器的處理。

400錯誤請求)

器不理解求的法。

401(未授

請求要求身份驗證。對於登入後請求的網頁,伺服器可能返回此響應

403(禁止)

器拒絕請求。如果您在 Googlebot 嘗試抓取您網站上的有效網頁時看到此狀態碼(您可以在 Google 網站管理工具斷下的網抓取面上看到此資訊),可能是您的服器或主機拒 Googlebot 訪問

404(未找到)

伺服器找不到請求的網頁。例如,對於伺服器上不存在的網頁經常會返回此程式碼。

如果您的網站上沒有 robots.txt 檔案,而您在 Google 網站管理員工具上看到此狀態碼,則這是正確的狀態碼。但是,如果您有 robots.txt 檔案而又看到此狀態碼,則說明您的 robots.txt 檔案可能命名錯誤或位於錯誤的位置(該檔案應當位於頂級域,名為 robots.txt)。

如果對於 Googlebot 抓取的網址看到此狀態碼(在診斷標籤的上),則表示 Googlebot 跟隨的可能是另一個頁面的無效連結(是舊連結或輸入有誤的連結)。

405(方法禁用)

禁用求中指定的方法。

406(不接受)

無法使用求的內容特性響應請求的網

407(需要代理授

此狀態碼 <a href=answer.py?answer=35128>401(未授</a>類似,但指定請求者應當授權使用代理。如果伺服器返回此響應,還表示請求者應當使用代理

40