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

Расположение 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", а я этого не хочу.

Напишите расположение Блок "/ rails" выше определенного блока в целях безопасности.

Цитаты из описания локации nginx

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

Ты можешь использовать 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 block должен использовать отрицательное утверждение регулярного выражения:

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;
}