我似乎找不到足够的文档。我有一个应用程序可以生成一些动态响应,但仍可以从Last-Modified
标头中受益 - 所以我发送了它。
但是,打开if_modified_since
(设置为before
,每http://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since) 似乎对非静态资源没有任何影响。例如 php、python 应用程序。
这是因为 Nginx 不只是查看我的响应Last-Modified
标头吗?因为我可以看到它们似乎设置正确,如下所示:
> GET /3.0/view.json?id=2 HTTP/1.1
> Host: xxxxxxxxxxxxx
> Accept: */*
> If-Modified-Since: Sat, 02 May 2015 19:43:02 GMT
>
< HTTP/1.1 200 OK
* Server nginx/1.4.7 is not blacklisted
< Server: nginx/1.4.7
< Date: Fri, 01 May 2015 19:56:05 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Fri, 01 May 2015 19:56:05 GMT
或者我忽略了更大的问题?我只是好奇它
if_modified_since
是如何实现的,与我设定的期望相比。我以为它只会查看响应标头,并根据需要覆盖状态。我错了吗?
答案1
在应用程序回复中发送Last-Modified
标头是一个开始,但似乎您无法If-Modified-Since
正确处理传入的请求,因为您的应用程序应该回复304 Not Modified
而不是200 OK
。更改 nginx 上的指令只会影响由 nginx 直接提供的请求,即静态资源,除非您将其配置为反向代理缓存。在这种情况下,您可能会针对此标头值提供过时的回复,因为内容将在一段时间内缓存而不会影响您的应用程序。开启后,一旦缓存过期<X>_cache_revalidate
,将使用If-Modified-Since
标头重新验证 nginx 缓存和您的应用程序之间的缓存内容(其中<X>
= proxy / fastcgi / scgi / uwsgi)
答案2
由于您没有提到有关 Nginx 中的缓存配置的任何信息,我假设您没有设置缓存,这可以解释为什么您的If-Modified-Since
标头对动态响应没有影响。
对于静态资源,Nginx 有一个非常简单的方法来确定如何处理If-Modified-Since
:它将字段中的时间与文件上次修改的时间进行比较。那里没有问题。
当你希望 Nginx 对动态生成的响应执行相同操作时,它没有什么可以与之比较的,除非你打开缓存。默认情况下,Nginx 不会记住它所服务的响应。当您打开缓存时,Nginx 有办法将传入的请求与之前给出的响应进行比较,从而有办法使用If-Modified-Since
。
我发现本文了解设置 Nginx 缓存的细节确实很有用。