nginx не устанавливает заголовки срока действия в статических ресурсах Rails

StackOverflow https://stackoverflow.com/questions/873235

  •  22-08-2019
  •  | 
  •  

Вопрос

Кажется, я не могу заставить 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;
        }
}

Я не уверен, почему в моих статических ресурсах не установлены заголовки с истекшим сроком действия (например,/images/foo.png?123456 )

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

Это было полезно?

Решение 2

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

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

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

Другие советы

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

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

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

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

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

Возможно, это поможет:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top