HTTP 304 Not Modified响应是否包含缓存控制头?

时间:2021-12-08 03:50:51

I've tried to understand this, and searched SO for similar questions, but I still don't have a 100% understanding on how this is supposed to work.

我试图理解这一点,并搜索SO以寻找类似的问题,但我仍然没有100%理解它应该如何工作。

I get this response on a request for an image resource:

我得到了对图像资源请求的响应:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:04:04 GMT
    Expires Mon, 19 Oct 2009 09:06:05 GMT
    Cache-Control   public, max-age=120
    Etag    image_a70703fb393a60b6da346c112715a0abd54a3236
    Content-Disposition inline;filename="binary-216-420"
    Content-Type    image/jpg;charset=UTF-8
    Content-Length  4719

The desired behavior is that the client should cache this for 120 seconds, then request it from the server again. Within the 120 seconds, no request is sent to the server.

所需的行为是客户端应该缓存120秒,然后再次从服务器请求它。在120秒内,没有请求发送到服务器。

Then, after 120 seconds, a request is sent and a 304 response is received:

然后,在120秒后,发送请求并收到304响应:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:06:13 GMT

Request Headers
    Host    localhost:8080
    User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
    Accept  image/png,image/*;q=0.8,*/*;q=0.5
    Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  300
    Connection  keep-alive
    Referer http://localhost:8080/cms/site/0/en/home
    Cookie  JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
    If-None-Match   image_a70703fb393a60b6da346c112715a0abd54a3236

So far, all well. But then, on the next request (whithin 120 seconds) i would have thought that the resource should be cached for 120 new seconds. What i see in the browser (Firefox) on the other hand, is that it from this point on always request the resource and receives the 304-response.

到目前为止,一切顺利。但是,在下一个请求(在120秒内),我会认为资源应缓存120秒。另一方面,我在浏览器(Firefox)中看到的是,从这一点开始,它始终请求资源并接收304响应。

Am I supposed to attach the cache-control headers in the 304-response? From what i can read in the spec, it seems like the cache-control settings should be omitted, and that the cache should cache it for 120 new seconds automatically?

我应该在304响应中附加缓存控制头吗?从我在规范中可以看到的内容,似乎应该省略缓存控制设置,并且缓存应该自动缓存120新的秒数?

3 个解决方案

#1


39  

In theory you shouldn't have to send Cache-Control for a 304 -- the recipient should just continue to use the cache directives that it received from the original 200. However, as you've found, in practice if you don't keep sending Cache-Control, browsers will ignore the cache directives that you sent originally, and revert to their own default heuristics.

从理论上讲,您不必为304发送Cache-Control - 收件人应该继续使用从原始200收到的缓存指令。但是,正如您所发现的,在实践中如果不这样做继续发送Cache-Control,浏览器将忽略您最初发送的缓存指令,并恢复为自己的默认启发式。

So in practice, you should include the same Cache-Control with a 304 that you would with a 200. The spec only mandates that you send it for a 304 if it's different than what you sent previously (see 10.3.5 304 Not Modified) -- but it certainly doesn't forbid you from repeating it when it's the same.

因此,在实践中,您应该使用与200一样的304包含相同的Cache-Control。如果规则与您之前发送的不同,那么规范只要求您将其发送给304(参见10.3.5 304未修改) - 当它同样时,它肯定不会禁止你重复它。

And to respond specifically to the wrong-headed points from the other answer (Structure's):

并从另一个答案(结构)专门回应错误的观点:

  1. You do want intermediary caches to cache the response (that is, update their cache entry for the resource). They will respond appropriately to requests from clients with a 200 or a 304, depending on whether the client included a conditional header like If-Modified-Since.

    您确实希望中间缓存缓存响应(即更新其资源的缓存条目)。它们将适当地响应来自具有200或304的客户端的请求,具体取决于客户端是否包括If-Modified-Since等条件头。

  2. The 120-second ttl will be refreshed by the 304 (so the same client shouldn't make another request for the same resource for at least another 120 seconds). And clients, as long as they've still got the content cached, will continue to make conditional requests for the resource, which you can continue to respond to with a 304.

    304将刷新120秒的ttl(因此同一客户端不应再对另一个120秒的相同资源发出另一个请求)。并且客户端,只要他们仍然获得缓存的内容,将继续对资源进行条件请求,您可以继续使用304响应。

#2


46  

RFC7232 updates RFC2616 to say:

RFC7232更新RFC2616说:

The server generating a 304 response MUST generate any of the following header fields that would have been sent in a 200 (OK) response to the same request: Cache-Control, Content-Location, Date, ETag, Expires, and Vary.

生成304响应的服务器必须生成以下任何一个头字段,这些字段将在对同一请求的200(OK)响应中发送:Cache-Control,Content-Location,Date,ETag,Expires和Vary。

#3


2  

If I understand correctly then the browser is in fact caching for 120 seconds and your server is responding 304 Not Modified to subsequent If-Modified-Since requests. This "IMS" request occurs when the end-user accesses the same URL. At that time the browser can send an If-Modified-Since request. The browser wants to know if it is displaying stale content. This seems normal.

如果我理解正确,那么浏览器实际上是缓存120秒,并且您的服务器正在响应304 Not Modified到后续的If-Modified-Since请求。当最终用户访问相同的URL时,会发生此“IMS”请求。那时浏览器可以发送If-Modified-Since请求。浏览器想知道它是否显示陈旧内容。这似乎很正常。

Upon receiving this request your server should reply 200 OK, 304 Not Modified (or a 4XX, if necessary).

收到此请求后,您的服务器应回复200 OK,304 Not Modified(或4XX,如有必要)。

I do not believe you should set your server to send a Cache-Control header with the 304 response for two reasons:
1. You do not want any intermediary caches to cache that 304 response (there is a possibility that they could)
2. The 120 second TTL will not be refreshed by the 304 response. The browser will retain the object for 120 seconds from the 200 OK response. After 120 seconds the browser should send a GET request, not an If-Modified-Since, so your server will respond with the bytes of the file and not just a 304 response.

我不相信您应该将服务器设置为发送带有304响应的Cache-Control标头,原因有两个:1。您不希望任何中间缓存缓存304响应(有可能它们可以)2。 304响应不会刷新120秒TTL。浏览器将从200 OK响应中保留对象120秒。 120秒后,浏览器应发送GET请求,而不是If-Modified-Since,因此您的服务器将使用文件的字节进行响应,而不仅仅是304响应。

Note that the browser will not request the file again automatically after 120 seconds unless the end-user specifically requests it via a page load or directly inputting the URL into their address bar (or unless you have a custom application that controls that functionality somehow).

请注意,除非最终用户通过页面加载或直接将URL输入其地址栏(或者除非您有一个以某种方式控制该功能的自定义应用程序),否则浏览器将不会在120秒后自动再次请求该文件。

Edited the first paragraph to read a bit better(hopefully)

编辑第一段读得更好(希望如此)

#1


39  

In theory you shouldn't have to send Cache-Control for a 304 -- the recipient should just continue to use the cache directives that it received from the original 200. However, as you've found, in practice if you don't keep sending Cache-Control, browsers will ignore the cache directives that you sent originally, and revert to their own default heuristics.

从理论上讲,您不必为304发送Cache-Control - 收件人应该继续使用从原始200收到的缓存指令。但是,正如您所发现的,在实践中如果不这样做继续发送Cache-Control,浏览器将忽略您最初发送的缓存指令,并恢复为自己的默认启发式。

So in practice, you should include the same Cache-Control with a 304 that you would with a 200. The spec only mandates that you send it for a 304 if it's different than what you sent previously (see 10.3.5 304 Not Modified) -- but it certainly doesn't forbid you from repeating it when it's the same.

因此,在实践中,您应该使用与200一样的304包含相同的Cache-Control。如果规则与您之前发送的不同,那么规范只要求您将其发送给304(参见10.3.5 304未修改) - 当它同样时,它肯定不会禁止你重复它。

And to respond specifically to the wrong-headed points from the other answer (Structure's):

并从另一个答案(结构)专门回应错误的观点:

  1. You do want intermediary caches to cache the response (that is, update their cache entry for the resource). They will respond appropriately to requests from clients with a 200 or a 304, depending on whether the client included a conditional header like If-Modified-Since.

    您确实希望中间缓存缓存响应(即更新其资源的缓存条目)。它们将适当地响应来自具有200或304的客户端的请求,具体取决于客户端是否包括If-Modified-Since等条件头。

  2. The 120-second ttl will be refreshed by the 304 (so the same client shouldn't make another request for the same resource for at least another 120 seconds). And clients, as long as they've still got the content cached, will continue to make conditional requests for the resource, which you can continue to respond to with a 304.

    304将刷新120秒的ttl(因此同一客户端不应再对另一个120秒的相同资源发出另一个请求)。并且客户端,只要他们仍然获得缓存的内容,将继续对资源进行条件请求,您可以继续使用304响应。

#2


46  

RFC7232 updates RFC2616 to say:

RFC7232更新RFC2616说:

The server generating a 304 response MUST generate any of the following header fields that would have been sent in a 200 (OK) response to the same request: Cache-Control, Content-Location, Date, ETag, Expires, and Vary.

生成304响应的服务器必须生成以下任何一个头字段,这些字段将在对同一请求的200(OK)响应中发送:Cache-Control,Content-Location,Date,ETag,Expires和Vary。

#3


2  

If I understand correctly then the browser is in fact caching for 120 seconds and your server is responding 304 Not Modified to subsequent If-Modified-Since requests. This "IMS" request occurs when the end-user accesses the same URL. At that time the browser can send an If-Modified-Since request. The browser wants to know if it is displaying stale content. This seems normal.

如果我理解正确,那么浏览器实际上是缓存120秒,并且您的服务器正在响应304 Not Modified到后续的If-Modified-Since请求。当最终用户访问相同的URL时,会发生此“IMS”请求。那时浏览器可以发送If-Modified-Since请求。浏览器想知道它是否显示陈旧内容。这似乎很正常。

Upon receiving this request your server should reply 200 OK, 304 Not Modified (or a 4XX, if necessary).

收到此请求后,您的服务器应回复200 OK,304 Not Modified(或4XX,如有必要)。

I do not believe you should set your server to send a Cache-Control header with the 304 response for two reasons:
1. You do not want any intermediary caches to cache that 304 response (there is a possibility that they could)
2. The 120 second TTL will not be refreshed by the 304 response. The browser will retain the object for 120 seconds from the 200 OK response. After 120 seconds the browser should send a GET request, not an If-Modified-Since, so your server will respond with the bytes of the file and not just a 304 response.

我不相信您应该将服务器设置为发送带有304响应的Cache-Control标头,原因有两个:1。您不希望任何中间缓存缓存304响应(有可能它们可以)2。 304响应不会刷新120秒TTL。浏览器将从200 OK响应中保留对象120秒。 120秒后,浏览器应发送GET请求,而不是If-Modified-Since,因此您的服务器将使用文件的字节进行响应,而不仅仅是304响应。

Note that the browser will not request the file again automatically after 120 seconds unless the end-user specifically requests it via a page load or directly inputting the URL into their address bar (or unless you have a custom application that controls that functionality somehow).

请注意,除非最终用户通过页面加载或直接将URL输入其地址栏(或者除非您有一个以某种方式控制该功能的自定义应用程序),否则浏览器将不会在120秒后自动再次请求该文件。

Edited the first paragraph to read a bit better(hopefully)

编辑第一段读得更好(希望如此)