代码之家  ›  专栏  ›  技术社区  ›  cpjolicoeur

nginx not setting expires rails静态资源上的头文件

  •  7
  • cpjolicoeur  · 技术社区  · 16 年前

    我似乎无法让nginx在我的Rails应用程序的静态资产上设置Expires头文件。

    我的应用程序是使用phulsion 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 回复  |  直到 16 年前
        1
  •  10
  •   djanowski    14 年前

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

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

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

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

    如果没有指定时间戳,那么您依赖于 Last-Modified ETag ,由nginx自动处理。

        2
  •  5
  •   cpjolicoeur    16 年前

    所以我最终找到了解决办法。我的regexp有点落后,因为我没有考虑到这个可能性?时间戳不存在。

    这个雷杰夫为我工作。

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

    也许这会有帮助:

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

    也读 how Nginx evaluates location . 你确定你没有其他的线吗 location 在配置文件中,与regexp之前的静态资源匹配 位置 做?

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

        4
  •  0
  •   Anatoly    14 年前

    不需要使用“break”指令,但访问注销;将非常有用:

      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