2012-04-25 14 views
113

我上Wikipedia讀到附註報頭表示:Pragma和Cache-control標題之間的區別?

「雜注:no-cache標題字段是HTTP/1.0報頭用於在請求 使用它是瀏覽器的裝置。告訴服務器和 任何中間緩存,它想要一個新的版本的資源, 不是讓服務器告訴瀏覽器不要緩存資源。一些 用戶代理在迴應中確實注意到這個頭,但是 HTTP /1.1 RFC特別警告不要依賴這種行爲。「

但我還沒有明白它的作用? Cache-Control標題的值是no-cachePragma,它們的值也是no-cache之間的區別是什麼?

回答

132

Pragma是HTTP/1.0實現,cache-control是同一概念的HTTP/1.1實現。它們都是爲了防止客戶緩存響應。老客戶端可能不支持HTTP/1.1,這就是爲什麼這個頭還在使用中。

+22

儘管下面cnst的答案要複雜得多,但根據規範它也更加正確。 'Pragma:no-cache'旨在僅用於請求(意思是「我想要原始的,而不是緩存的副本」),並且它的行爲沒有被指定用於響應。 – clime 2013-03-07 13:49:27

+4

'Cache-Control:no-cache'對於請求具有相同的含義,但實際上也對響應進行了定義,意思是「如果您以後要使用此緩存副本,則必須先與我聯繫, (即執行重新驗證)「。 – clime 2013-03-07 14:03:12

+1

它用於緩存控制,它不必僅用於防止緩存,它也可以用來說「你可以緩存這個」。 .... – 2015-01-21 10:01:03

75

除了Pragma只被定義爲適用於客戶端的請求,而Cache-Control可以被客戶端的請求和服務器的回覆所使用,沒有什麼區別。

因此,就標準而言,只能從客戶端發出請求和服務器接收客戶端請求的角度進行比較。該http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32定義場景如下:

HTTP/1.1緩存應該把「雜注:無緩存」作爲如果客戶端發送 「緩存控制:無緩存」。在HTTP中定義的新Pragma指令不會是 。

Note: because the meaning of "Pragma: no-cache as a response 
    header field is not actually specified, it does not provide a 
    reliable replacement for "Cache-Control: no-cache" in a response 

的方式我就看了上面:

  • 如果你正在寫一個客戶端和需要no-cache

    • 只使用Pragma: no-cache在您的請求,因爲你可能不知道服務器是否支持Cache-Control;
    • 但答覆,以決定是否緩存,檢查Cache-Control
  • 如果你正在寫一個服務器:

      從客戶端解析請求
    • ,檢查Cache-Control;如果未找到,請檢查Pragma: no-cache,並執行Cache-Control: no-cache邏輯;
    • 在回覆中,提供Cache-Control

當然,現實中可能是從什麼書面或暗示的RFC不同!

+4

如果標題都有? 'Cache-Control:max-age = 86400'和 'Pragma:no-cache'?哪一個會被現代瀏覽器所尊敬? – PKHunter 2017-02-14 11:52:15

+2

@PKHunter,如果行爲未定義,爲什麼你會關心它走向哪條路?如果你對服務器負責,顯然你可以做得比向客戶發佈誤導信息要好。另外,正如我的回答所指出的那樣,Pragma:no-cache只是爲來自瀏覽器的請求定義的,因此它將完全無效,並且在從服務器到瀏覽器的回覆中是未定義的,例如,我想象得到每一個瀏覽器(無論是否現代)都應該在它可能收到的任何回覆中忽略這樣的標題。 – cnst 2017-02-21 20:06:15