Назад | Перейти на главную страницу

Как избежать дублирования конфигурации в Nginx Location Config

В качестве примера возьмем эту конфигурацию местоположения Nginx:

location ~* \.(gif|jpg|jpeg|swf|css)$ {
  add_header Cache-Control "max-age=259200, public";
}

location ^~ /abc/ {
  try_files $uri /abc/generic.png;
}

Для запроса /abc/x.jpg он будет соответствовать второму местоположению, и ответ НЕ будет иметь заголовка Cache-Control. Как сделать так, чтобы заголовок Cache-Control был применен и к /abc/x.jpg?

Что-то вроде этого могло бы сработать, но это как бы дублирование.

location ~* \.(gif|jpg|jpeg|swf|css)$ {
  add_header Cache-Control "max-age=259200, public";
}

location ^~ /abc/ {
  try_files $uri /abc/generic.png;

  location ~* \.(gif|jpg|jpeg|swf|css)$ {
    add_header Cache-Control "max-age=259200, public";
  }
}

Вы можете использовать что-то вроде этого.

location ~* \.(gif|jpg|jpeg|swf|css)$ {
  add_header Cache-Control "max-age=259200, public";
}

location /abc {
  try_files $uri /abc/generic.png;
}

в Nginx приоритет выглядит следующим образом: сначала = (равно), затем ^ ~ (без регулярного выражения), затем ~ (с учетом регистра), затем ~ * (без учета регистра), затем нет. так как код был изменен на / abc, его приоритет идет вниз, и поэтому первый блок местоположения вызывается первым, когда обнаруживается URI, который заканчивается заданным расширением изображения. и если он не найден, и если URI содержит / abc блокировать что-то как /abc/file/file.pdf, /abc/file.pdf, вызывается другой блок местоположения.