【问题标题】:How does Nginx handle `If-None-Match` and `If-Modified-Since` headers when configured as a reverse proxy cache?当配置为反向代理缓存时,Nginx 如何处理“If-None-Match”和“If-Modified-Since”标头?
【发布时间】:2022-05-21 09:59:49
【问题描述】:

我有一个 PHP CMS 作为提供内容的上游/源服务器。它位于配置为反向代理缓存的 Nginx Web 服务器后面,带有 proxy_passproxy_cache

在上游/源服务器上实现304 Not Modified 响应时,我注意到我有时会从代理获得304 Not Modified 响应而没有调用我的上游/源服务器。

我的代理配置如下所示(注意我没有缓存 304 响应):

http {
  #...
  proxy_cache_path /usr/share/nginx/cache/ levels=1:2 keys_zone=microcache:10m max_size=1024m inactive=1h;
}

server {
  server_name _;
  
  #...

  location / {
    proxy_cache microcache;
    proxy_cache_revalidate on;
    add_header X-Cache-Status $upstream_cache_status;
    #...
    proxy_cache_valid 200 301 302 1m;
    proxy_pass http://upstream;
  }
}

第一次访问 URL 时,我得到一个带有 X-Cache-Status: MISS200 以及由源返回的 ETagLast-Modified 标头。

我第二次点击该 URL,我得到一个 X-Cache-Status: HIT 并且我的源没有被调用,所以一切都很好!

但是,如果我再次点击 URL,这次使用带有第一次调用时收到的值的 If-Modified-SinceIf-None-Match 标头,我会得到一个 304 Not ModifiedX-Cache-Status: HIT,但仍然没有调用我的源服务器!

我似乎 Nginx 在其缓存中有内容,并与传入的标头一起计算它应该返回 304。这意味着如果内容在 Nginx 缓存中,我的来源永远不会返回 304。

我说的对吗?我找不到有关此行为的任何文档。但是,我在 Nginx 源代码中发现了一个似乎正在处理类似内容的模块:https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_not_modified_filter_module.c#L78

能否请您提供有关此行为、其工作原理以及在我的配置中启用它的原因的见解?

非常感谢!

【问题讨论】:

    标签: nginx caching nginx-reverse-proxy http-status-code-304


    【解决方案1】:
    proxy_cache_path /usr/share/nginx/cache/ levels=1:2 keys_zone=microcache:10m max_size=1024m inactive=1h;
    
    proxy_cache microcache;
    

    意思是nginx服务器将缓存数据存储到/usr/share/nginx/cache/

    proxy_cache_valid 200 301 302 1m;
    

    这意味着任何 HTTP 状态为 200、301 或 302 的 HTTP API 调用都会使用 nginx 本地缓存(存储在 /usr/shre/nginx/cache)一分钟。

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 2023-03-31
      • 2014-10-08
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多