Правила Nginx для обработки местоположений следующие: это перечисляет все обычные местоположения и находит наиболее точное совпадение (виды Nginx все обычные местоположения для оптимизации этого шага). После этого Nginx выполняет все "regexp" местоположения в порядке их появления. Если какое-либо "regexp" местоположение успешно выполнится, то Nginx будет использовать это первое соответствие. Если никакое "regexp" местоположение не успешно выполнилось, Nginx использует обычное местоположение, найденное на предыдущем шаге.
В Вашем случае, с тех пор "regexp" местоположения имеют приоритет по местоположениям "префикса", вот почему Ваш /admin/.+\.php$
выбран для обработки запроса к /admin/secret.php
.
Возможно запретить поиск regexp использование местоположений ^~
модификатор или указывает использование точного совпадения =
модификатор:
location = /admin/secret.php { ...
Обратите внимание, что я только что заметил, что фрагмент конфигурации в Вашем вопросе является неправильным - Вы имеете ^~
перед regexp, где ~
должен быть. То, что Вы должны иметь:
location = /admin/secret.php {
location ~ ^/admin/.+\.php$ {