我似乎找不到足够的文档。我有一个应用程序可以生成一些动态响应,但仍然可以从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
实施,与我设定期望的地方相比。我假设它只会查看响应标头,并根据需要覆盖状态。我错了吗?
在您的应用回复中发送
Last-Modified
标头是一个开始,但您似乎没有If-Modified-Since
正确处理传入的请求,因为您的应用应该回复304 Not Modified
而不是回复200 OK
。更改 nginx 上的指令只会影响 nginx 直接服务的请求,即静态资源,除非您将其配置为反向代理缓存。在这种情况下,您可能会针对此标头值提供过时的回复,因为内容将被缓存一段时间而不会影响您的应用。<X>_cache_revalidate
启用后,将使用If-Modified-Since
标头重新验证 nginx 缓存和您的应用程序之间的缓存内容(其中<X>
= proxy / fastcgi / scgi / uwsgi )由于您没有提及有关 Nginx 中缓存配置的任何内容,我将假设您没有设置缓存,这将解释为什么您的
If-Modified-Since
标头对动态响应没有影响。对于静态资源,Nginx 有一个非常简单的方法来确定如何处理
If-Modified-Since
:它将字段中的时间与文件上次修改的时间进行比较。那里没问题。当您希望 Nginx 对动态生成的响应执行相同操作时,除非您打开缓存,否则没有什么可以与之比较的。默认情况下,Nginx 不会记住它提供的响应。当你打开缓存时,Nginx 可以将传入的请求与之前给出的响应进行比较,因此可以使用
If-Modified-Since
.我发现这篇文章对于学习设置 Nginx 缓存的细节非常有用。