Nginx 不会为“if-modified-since”标头返回 304

and*_*die 4 curl nginx ratpack server

我有一台运行 nginx 的服务器,该服务器为使用 ratpack 构建的 Web 应用程序提供服务,但从浏览器或使用 curl 请求网站时,我无法获得 304 响应。

Nginx 配置:

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_read_timeout 240;
    proxy_pass http://example.com/;
    proxy_redirect off;
    add_header Last-modified "Wed, 29 Nov 2017 12:56:25";
    if_modified_since   before;
}
Run Code Online (Sandbox Code Playgroud)

从浏览器我总是得到 200 ok 和 curl 我得到

HTTP/1.1 302 Found
Server: nginx/1.6.3
Date: Wed, 29 Nov 2017 14:23:07 GMT
Content-Length: 0
Connection: keep-alive
location: http://example.com/display
Last-Modified: Wed, 29 Nov 2017 12:56:25
Run Code Online (Sandbox Code Playgroud)

我已经尝试了这两个 curl 命令,并且都给出了上述响应:

curl -I -H "If-Modified-Since: Wed,  29 Nov 2017 14:27:08" -X GET 
https://example.com

curl -I -H "If-Modified-Since: Wed,  29 Nov 2017 14:27:08" 
https://example.com
Run Code Online (Sandbox Code Playgroud)

为什么我在浏览器中得到 302 和 200 ok?我究竟做错了什么?我可以看到浏览器正在使用“If-Modified-Since”标头发出请求。当我重新加载页面资源时,从浏览器缓存中加载,并且硬重新加载所有资源都获得 200 ok。

roh*_*anc 5

为了让后端应用服务器https://example.com生成 304 响应,它需要查看If-Modified-Since请求标头。在您的情况下,该标头到达 nginx 但未到达应用程序服务器。你需要告诉nginx通过它。将以下内容添加到您的位置块:

proxy_set_header If-Modified-Since $http_if_modified_since;
Run Code Online (Sandbox Code Playgroud)

删除if_modified_since beforeadd_header Last-modified。这些行没有帮助,因为Last-Modified需要由应用程序服务器生成,而不是由您的 nginx 代理生成。

通过无条件地查询应用程序服务器(并完成生成响应所需的所有工作),然后决定是否发送 304,而不是传递完整的响应,nginx 代理可能会负责是否发送 304 (可能是代码 200),基于该响应中的Last-Modified标头,但我看不出这样做有任何好处。

另一个问题的回答帮助我意识到 nginx 代理对其代理的动态内容的新鲜度知之甚少。