使用nginx缓存POST响应:我应该将Cache-Control标头转发给客户端吗?

时间:2017-07-25 13:04:11

标签: http caching nginx reverse-proxy w3c

我们的系统使用POST请求预加载资产列表。给定相同的资产标识符列表,服务器将使用相同的资产数据列表进行响应。由于标识符列表可能很长(它实际上是包含JSON列表的多部分请求),因此我们使用POST而不是GET,尽管它幂等。

我们在这些服务器前面使用NGINX作为反向代理。我成功地将它配置为工作,但有一些“感觉”错了;我在POST响应中返回一个Cache-Control: max-age=3600标题,我希望将其缓存,并且在将它们返回给客户端之前让NGINX剥离它们。

RFC 7234仅表示方法,uri将用作缓存键;我可以使用Vary标题,但它似乎仅限于其他标题...

我不确定浏览器的可靠性。似乎“如果我使HTTP POST响应可缓存,它将被缓存为”未来的GET请求“,这不是我想要的。

所以,我的选择似乎是:

  1. 返回一个Cache-Control标题知道(或希望?)在它前面会有一个反向代理剥离该标题。
  2. 返回Cache-Control标题,然后让它通过。如果有人可以解释为什么它实际上是可靠的,那就很简单(或者是否有另一个类似的标题?)
  3. 不要使用Cache-Control而是直接在我的NGINX配置中“硬编码”所有网址(虽然我无法使其工作)
  4. 我可以用一种可靠的方法来实现我的需求吗?非常感谢你的帮助。

    以下是NGINX配置的摘录,如果这有助于某人:

    proxy_cache_path /path/to/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    
    location /path/to/post/request {
      proxy_pass http://remote-server;
      proxy_cache my_cache;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_cache_lock on;
      proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
      proxy_cache_methods POST;
      proxy_cache_key "$scheme$proxy_host$uri$is_args$args|$request_body";
      proxy_cache_valid 5m;
      client_max_body_size 1500k;
      proxy_hide_header Cache-Control;
    }
    

0 个答案:

没有答案