nginx没有在Rails静态资产上设置expires头

时间:2009-05-16 20:31:09

标签: ruby-on-rails nginx

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

我的应用程序使用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)

我不确定它是否与乘客有关,或者我的位置regexp是不是没有抓住它

4 个答案:

答案 0 :(得分:10)

只是想指出让时间戳可选是一个坏主意 - 如果它不包括在内,那么设置expires max是错误的,因为无法刷新文件。

此外,Nginx中的location指令无法查看查询字符串,因此此处发布的解决方案永远不会与“可选”时间戳匹配。

正确的解决方案(即只有在使用时间戳请求文件时才发送最大值的解决方案)将是:

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

如果未指定时间戳,则您依赖于Last-ModifiedETag,这些内容由Nginx自动处理。

答案 1 :(得分:5)

所以我最终找到了解决方案。我的regexp有点偏,因为我没有考虑到时间戳不存在的可能性。

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

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

答案 2 :(得分:0)

也许这会有所帮助:

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

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

顺便说一句,请考虑使用try_files代替if (-f $document_root/...)

答案 3 :(得分:0)

没有必要使用“break”指令,但是access_log off;将是有用的:

  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