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

Правило nginx - сопоставить все пути кроме одного

Я пытаюсь сопоставить все пути, начинающиеся с / 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])$