7

我似乎无法让 nginx 在我的 Rails 应用程序中的静态资产上设置过期标头。

我的应用程序是使用 Phusion Passenger 和 nginx 部署的。

下面是我的 nginx 配置文件的相关部分

server {
        listen  80;
        server_name my.domain.tld;
        root /home/deploy/my.domain.tld/current/public;
        passenger_enabled on;
        access_log off;

        location ~* \.(ico|css|js|gif|jp?g|png)\?[0-9]+$ {
                expires max;
                break;
        }

        if (-f $document_root/system/maintenance.html) {
                rewrite ^(.*)$ /system/maintenance.html break;
        }
}

我不确定为什么它没有设置过期我的静态资产上的标题(例如 /images/foo.png?123456 )

我不确定它是否与乘客有关,或者我的位置正则表达式是否没有捕捉到它

4

4 回答 4

10

Just wanted to point out that making the timestamp optional is a bad idea – if it's not included, then setting expires max is wrong as there would be no way of refreshing the file.

Also, the location directive in Nginx can't see the query string, so the solution posted here never matches the 'optional' timestamp.

A proper solution (ie one that sends the maximum expires only when the file was requested with a timestamp) would be:

location ~* \.(js|css|png|jpg)$ {
  if ($query_string ~ "^[0-9]+$") {
    expires max;
    break;
  }
}

If the timestamp is not specified, then you rely on Last-Modified and ETag, which are handled automatically by Nginx.

于 2010-08-25T23:15:18.013 回答
5

所以我最终找到了解决方案。我的正则表达式有点偏离,因为我没有考虑 ?timestamp 不存在的可能性。

这个正则表达式对我有用。

location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ {
于 2009-05-20T18:51:55.370 回答
1

无需使用“break”指令,但 access_log 关闭;会有用:

  location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ {
      access_log off;
      expires max;
      add_header Cache-Control public;
  }

你可以在 github 上看到完整的配置文件:https ://gist.github.com/711913

于 2010-12-03T05:43:19.577 回答
0

也许这会有所帮助:

location ~* ^.*\.(ico|css|js|gif|jp?g|png)\?[0-9]+$ {

另请阅读Nginx 如何评估 location。您确定在您的正则表达式之前,您的配置文件中没有任何其他字符串location与您的静态资源匹配location吗?

顺便说一句,考虑使用try_files而不是if (-f $document_root/...).

于 2009-05-16T20:52:12.103 回答