Как я могу написать блок местоположения, который соответствует любому пути, заканчивающемуся следующими расширениями:
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;
}