2

我正在尝试为 nginx (0.7.67) 上的静态文件配置 Expires 标头。静态文件由 Golang 反向代理提供:

location /rev/ {
  proxy_pass http://localhost:8910/;
  proxy_redirect off;
  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  https;

  # I am putting this here, because nginx only uses one location. Is this OK?
  location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
    expires 30d;
  }
}

当我这样做时,重新启动 nginx 没有错误,但不再提供静态文件。

已经尝试过以下星座,但它不起作用:

server {
  ...
  location /rev/ {
    proxy_pass http://localhost:8910/;
    proxy_redirect off;
    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  https;
  }

  location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
      expires 30d;
  }
}

问题:如何为位于反向代理后面的应用程序上的静态文件应用过期标头?

4

3 回答 3

7

我设法完成它的唯一方法是这样:

location / {
    proxy_pass  http://tomcat;
}

# CACHING WITH NO LOGGING
location ~* ^.+\.(atom|bmp|bz2|doc|docx|eot|exe|gif|gz|ico|jpeg|jpg|mid|midi|mp4|ogg|ogv|otf|pdf|png|ppt|pptx|rar|rss|rtf|svg|svgz|swf|tar|tgz|ttf|txt|wav|woff|xls|zip)$ {
    access_log  off;
    log_not_found   off;
    expires     max;
    proxy_pass  http://tomcat;
}

# CACHING WITH 404 LOGGING
location ~* ^.+\.(css|js|xml)$ {
    access_log  off;
    log_not_found   on;
    expires     max;
    proxy_pass  http://tomcat;
}

希望能帮助到你!

于 2013-10-30T18:45:19.667 回答
1

通过阅读http://wiki.nginx.org/HttpProxyModule上的文档,我发现提到使用proxy_cache_*指令来实现类似的功能,尽管不完全是你所追求的。文档指出:

Upstream cache-related directives have priority over proxy_cache_valid value,
in particular the order is:

X-Accel-Expires
Expires/Cache-Control
proxy_cache_valid

因此,似乎Expires不支持或不推荐在代理级别设置标头。

我有一种感觉,您应该在Expires上游设置标题。这可以通过在 http 处理程序函数中设置 http.ResponseWriter 上的标头在 Go 中完成(有点骇人听闻,我确信有更好的方法来修复字符串中的时区):

w.Header().Set("Expires", strings.Replace(time.Now().AddDate(0, 0, 30).Format(time.RFC1123), "UTC", "GMT", 1))

如前所述,这在输出字符串中替换UTC为。GMT我不确定是否有必要,但我注意到这似乎是我检查过的任何 HTTP 标头中的常见形式。我还没有查看规范以查看UTC浏览器是否同样接受,但我不明白为什么不这样做。

抱歉,这不是一个真正的 Nginx 答案,希望对您有所帮助!

于 2013-03-25T10:41:36.933 回答
0

我认为expires指令或者add_header是你返回给浏览器的东西。

如果您一味地想缓存来自后端的内容,您可以尝试:

proxy_cache_valid any 1m;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

于 2016-08-05T11:13:22.907 回答