Местоположение 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 сначала проверяет местоположения, определенные с использованием префиксных строк (префиксные местоположения). Среди них местоположение с самым длинным совпадающим префиксом выбирается и запоминается. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений заканчивается при первом совпадении, и используется соответствующая конфигурация. Если совпадения с регулярным выражением не найдено, то используется конфигурация расположения префикса, запомненного ранее.