Местоположение Nginx соответствует нескольким расширениям, если путь не начинается с определенного слова

Как я могу написать блок местоположения, который соответствует любому пути, заканчивающемуся в следующих расширениях:

JPG | JPEG | GIF | CSS | PNG | JS | ICO | JSON | XML | TXT | HTML

Если путь не начинается с "/rails" (например: /rails/randomstring/image.png)?

В настоящее время у меня есть этот основной блок:

location ~* \.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
  gzip_static on;
  gzip on;
  expires max;
  add_header Cache-Control public;
}

Но это будет соответствовать "/rails/randomstring/image.png", и я не хочу этого.

2 ответа

Решение

Ты можешь использовать location ^~ определение, например:

location ^~ /rails/ {
    # your directives for "/rails/..." URIs here
}

location ~* \.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
    gzip_static on;
    gzip on;
    expires max;
    add_header Cache-Control public;
}

Согласно документации:

Если самое длинное совпадающее местоположение префикса имеет модификатор "^~", то регулярные выражения не проверяются.

Обновить

Еще один способ сделать это без объявления дополнительных location блок должен использовать отрицательное утверждение регулярного выражения:

location ~ ^(?!/rails/).*\.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
    gzip_static on;
    gzip on;
    expires max;
    add_header Cache-Control public;
}

Записать блок "/rails" над определенным блоком для безопасности.

Цитаты из описания местоположения nginx

Чтобы найти местоположение, соответствующее заданному запросу, nginx сначала проверяет местоположения, определенные с использованием префиксных строк (префиксные местоположения). Среди них местоположение с самым длинным совпадающим префиксом выбирается и запоминается. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений заканчивается при первом совпадении, и используется соответствующая конфигурация. Если совпадения с регулярным выражением не найдено, то используется конфигурация расположения префикса, запомненного ранее.

Другие вопросы по тегам