【问题标题】:nginx not setting expires headers on Rails static assetsnginx未设置过期Rails静态资产的标头
【发布时间】:2010-10-26 18:31:46
【问题描述】:

我似乎无法让 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)

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

【问题讨论】:

    标签: ruby-on-rails nginx


    【解决方案1】:

    不需要使用“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

    【讨论】:

      【解决方案2】:

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

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

      一个适当的解决方案(即,仅当请求带有时间戳的文件时才发送最大值过期的解决方案)是:

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

      如果没有指定时间戳,那么你依赖Last-ModifiedETag,它们由Nginx自动处理。

      【讨论】:

      • 我删除了 if,因为 CSS 引用的任何资产都没有时间戳。
      • 请参阅我回复的第一段,了解为什么这是一个非常糟糕的主意。您应该将时间戳附加到您的 CSS 引用的资产中。例如:github.com/djanowski/collage/blob/master/lib/…
      【解决方案3】:

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

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

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

      【讨论】:

      • 这是误导。 location 不会匹配查询参数,因此实际上它匹配列表中的 /all/ 图像、css、js 资产,而不管缓存破坏查询参数如何。这对许多人来说是不可取的。
      【解决方案4】:

      也许这会有所帮助:

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

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

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

      【讨论】:

      • 不,那是我当前的配置文件。没有其他位置指令。我会试试你的正则表达式,看看它是否设置了标题。另外,我不确定您为什么建议使用 try_files 而不是 -f 标志。为什么/如何在这种情况下 try_files 和改进?
      • 我不太确定,但是当人们询问有关 Nginx 邮件列表的重写时,Igor(作者)总是建议使用 try_files。 "if (-f ...)" 指令的解析速度可能比较慢,但我从未做过任何尝试。
      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多