Nginx 不会 return 304 for "if-modified-since" header
Nginx does not return 304 for "if-modified-since" header
我有一个服务器 运行 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;
}
从浏览器我总是得到 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
我试过这两个 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
为什么我在浏览器中使用 curl 得到 302 而得到 200 ok?
我究竟做错了什么?我可以看到浏览器正在使用 "If-Modified-Since" header 发出请求。当我重新加载页面资源时,会从浏览器缓存中加载,并且通过硬重新加载,所有资源都会获得 200 ok。
为了让后端应用程序服务器 https://example.com 生成 304 响应,它需要查看 If-Modified-Since 请求 header。在您的情况下, header 正在访问 nginx 而不是应用程序服务器。你需要告诉 nginx 让它通过。将以下内容添加到您的位置块:
proxy_set_header If-Modified-Since $http_if_modified_since;
删除 if_modified_since before
和 add_header Last-modified
。这些行没有帮助,因为 Last-Modified 需要由应用程序服务器生成,而不是由您的 nginx 代理生成。
有可能由nginx代理负责是否发送304,通过无条件查询应用服务器(并完成生成响应所需的所有工作),然后决定是否发送304,而不是根据该响应中的 Last-Modified header 传递完整响应(可能是代码 200),但我看不到这样做有任何好处方式。
another question 的回答让我意识到 nginx 代理对它所代理的动态内容的新鲜度知之甚少。
我有一个服务器 运行 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;
}
从浏览器我总是得到 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
我试过这两个 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
为什么我在浏览器中使用 curl 得到 302 而得到 200 ok? 我究竟做错了什么?我可以看到浏览器正在使用 "If-Modified-Since" header 发出请求。当我重新加载页面资源时,会从浏览器缓存中加载,并且通过硬重新加载,所有资源都会获得 200 ok。
为了让后端应用程序服务器 https://example.com 生成 304 响应,它需要查看 If-Modified-Since 请求 header。在您的情况下, header 正在访问 nginx 而不是应用程序服务器。你需要告诉 nginx 让它通过。将以下内容添加到您的位置块:
proxy_set_header If-Modified-Since $http_if_modified_since;
删除 if_modified_since before
和 add_header Last-modified
。这些行没有帮助,因为 Last-Modified 需要由应用程序服务器生成,而不是由您的 nginx 代理生成。
有可能由nginx代理负责是否发送304,通过无条件查询应用服务器(并完成生成响应所需的所有工作),然后决定是否发送304,而不是根据该响应中的 Last-Modified header 传递完整响应(可能是代码 200),但我看不到这样做有任何好处方式。
another question 的回答让我意识到 nginx 代理对它所代理的动态内容的新鲜度知之甚少。