nginx не устанавливает заголовки expires в статических ресурсах Rails - PullRequest
7 голосов
/ 17 мая 2009

Я не могу заставить nginx устанавливать заголовки expires для моих статических ресурсов в моем приложении 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;
        }
}

Я не уверен, почему в моих статических ресурсах не задано значение expires headers (например, /images/foo.png?123456)

Я не уверен, имеет ли это отношение к пассажиру, или регулярное выражение моего местоположения просто не ловит его

Ответы [ 4 ]

10 голосов
/ 26 августа 2010

Просто хотел бы отметить, что указывать временную метку необязательно - если она не включена, то установка expires max неверна, поскольку не будет никакого способа обновить файл.

Кроме того, директива location в Nginx не может видеть строку запроса, поэтому размещенное здесь решение никогда не соответствует «необязательной» временной отметке.

Правильное решение (т. Е. Отправляющее максимальное время истекает только тогда, когда файл был запрошен с отметкой времени) будет:

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

Если временная метка не указана, то вы полагаетесь на Last-Modified и ETag, которые автоматически обрабатываются Nginx.

5 голосов
/ 20 мая 2009

Итак, я нашел решение. Мое регулярное выражение было немного отклонено, так как я не принимал во внимание возможность того, что отметка времени не существовала.

Это регулярное выражение сработало для меня.

location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ {
0 голосов
/ 03 декабря 2010

нет необходимости использовать директиву 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

0 голосов
/ 17 мая 2009

Может быть, это поможет:

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

Также прочитайте как Nginx оценивает местоположение . Вы уверены, что у вас нет другой строки location в вашем конфигурационном файле, которая соответствует вашим статическим ресурсам до того, как ваше регулярное выражение location имеет?

Кстати, рассмотрите возможность использования try_files вместо if (-f $document_root/...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...