Nginx不会返回304,因为" if-modified-since"头

时间:2017-11-29 14:33:30

标签: curl nginx server ratpack

我有一台运行nginx的服务器,它服务于使用ratpack构建的Web应用程序,当我从浏览器或卷曲中请求网站时,我无法获得304响应。

Nginx conf:

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;
}

从浏览器中我总是得到200分,而且卷曲我得到了

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

我尝试了这两个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

为什么我在浏览器中获得302卷曲和200 ok? 我究竟做错了什么?我可以看到浏览器正在使用" If-Modified-Since"头。当我重新加载页面时,资源是从浏览器缓存加载的,并且通过硬重新加载所有资源得到200 ok。

1 个答案:

答案 0 :(得分:2)

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

proxy_set_header If-Modified-Since $http_if_modified_since;

删除if_modified_since beforeadd_header Last-modified。这些行无济于事,因为最后修改需要由应用程序服务器而不是您的nginx代理生成。

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

another question的回答使我意识到nginx代理对代理的动态内容的新鲜程度了解甚少。