Я пытаюсь сопоставить все пути, начинающиеся с / newsletter /, кроме одного (/ newsletter / one), с регулярным выражением. Что у меня есть на данный момент:
location ~ ^/newsletter/(.*)$ {
// configuration here
}
Это соответствует всем путям, начинающимся с / newsletter /.
Как сделать исключение для пути / информационного бюллетеня / one?
В итоге я использовал следующее решение:
location ~ ^/newsletter/(.*)$ {
location ~ /newsletter/one(.*) {
// logic here
}
// logic here
}
Это соответствует всем путям в / newsletter / *, а затем я сопоставляю все пути, которые начинаются с / newsletter / one, и применяю конфигурацию для информационного бюллетеня / one во внутреннем блоке конфигурации, в то время как остальную часть конфигурации я сохраняю во внешней конфигурации блок.
Это работает, но имеет один недостаток. Он также не будет соответствовать «единице», за которой следует какой-либо символ.
location ~ ^/newsletter/(?!one).*$ {
//configuration here
}
Хотя, может, и лучше:
location = /newsletter/one {
// do something (not serve an index.html page)
}
location ~ ^/newsletter/.*$ {
// do something else
}
Это работает, потому что, когда Nginx находит точное совпадение с =
он использует это location
обслужить запрос. Одна проблема в том, что это не будет совпадать, если вы используете index
страница, потому что запрос переписывается внутри и поэтому будет соответствовать второму location
"лучше" и используйте это. См. Следующее: https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms#matching-location-blocks
Есть раздел, в котором объясняется, как Nginx выбирает, какое местоположение использовать.
Чтобы прояснить решение varlogtim, следующее будет работать, что позволит вам сопоставить /newsletter/one-time
но все равно пропустить /newsletter/one
location ~ ^/newsletter/(?!one$).*$
Кроме того, если вы хотите игнорировать регистр в своем матче, используйте ~*
модификатор вместо ~
Вот такой:
^/newsletter(/&/[^o][^n][^e])$