Поскольку вы не хотите (или вам не разрешено) показывать весь блок вашего сервера, я сделаю несколько предположений. Что, скорее всего, произошло с вашей конфигурацией? Вы создали два дополнительных блока местоположения, которые используются для обработки Любые входящий запрос. Проверить место расположения
директива документация. Единственными двумя типами местоположения, которые могут перехватить запрос от местоположения, совпадающего с регулярным выражением, являются точное местоположение (расположение =/ури {...}
) и местоположение префикса "не проверять регулярное выражение" (местоположение ^~ / префикс { ... }
). В противном случае будет выбрано первое совпадение с регулярным выражением.
У каждого блока сервера есть свой корневой каталог, даже если он не указан явно с помощью параметра корень
директива. Его выбирают с помощью префикс (указывается на время компиляции, можно проверить с помощью нгинкс-V
команда) и /html
суффикс. Предположим, что ваш префикс nginx /usr/доля/nginx
. Тогда ваш корень по умолчанию будет в /usr/доля/nginx/html
каталог, если явно не указано с помощью корень /некоторый/путь
директива.
Поведение nginx по умолчанию при обслуживании запроса можно описать как try_files $uri $uri/ =404
.
Предположим, у нас есть https://mydomain.tld/foobar
запрос. Чтобы подать его в первый раз расположение ~* /foobar { перерыв; }
будет выбрано в качестве первого совпадающего местоположения регулярного выражения. Первая директива сломать
означает, что обработка текущего набора ngx_http_rewrite_module
директивы будут остановлены. Но нет ни одной из этих директив (кроме сломать
one) внутри этого блока локаций! Да, значит, это сломать
директива здесь бесполезна. Далее nginx проверит наличие /usr/доля/nginx/html/foobar
файл, индексный файл из /usr/доля/nginx/html/foobar/
каталог (по умолчанию index.html
), и после того, как обе проверки не пройдены, вернуть HTTP 404 не найден
ошибка.
Теперь предположим, что у нас есть https://mydomain.tld/
запрос. Ваш первый блок местоположения не будет соответствовать ему, поэтому второй расположение ~* / {...}
выбран для обработки этого запроса (этот блок местоположения будет соответствовать любому возможному допустимому запросу). Если проверка IP-адреса не пройдет, ее место займет перенаправление. Но если он пройдет, nginx обработает ваш запрос так же, как описано выше, вернув приветствие по умолчанию. index.html
файл из /usr/доля/nginx/html/
каталог.
Похоже, вы не понимаете, как директивы от ngx_http_rewrite_module
обрабатываются. Прочитайте еще раз самую первую часть документации:
сломать
, если
, возвращаться
, переписать
, и установлен
директивы обрабатываются в следующем порядке:
- директивы этого модуля, указанные на уровне сервера, выполняются последовательно;
- несколько раз:
- местоположение ищется на основе URI запроса;
- директивы этого модуля, указанные внутри найденного местоположения, выполняются последовательно;
- цикл повторяется, если URI запроса был перезаписан, но не более 10 раз.
Вы можете разместить свои проверки на уровне блока сервера:
если ($uri = /foobar) {
сломать;
}
если ($remote_addr!= 111.222.333.444) {
переписать ^ https://external.tld/
}
Вышесказанное сломать
директива будет работать как положено, выполнение ngx_http_rewrite_module
директивы на уровне сервера будут остановлены. Это означает, что любая другая директива из этого модуля (например, установлен
, если
, возвращаться
, переписать
д.), если таковые имеются, должны быть помещены перед вышеуказанный блок. Это не относится к ngx_http_rewrite_module
директивы, размещенные на уровне местоположения.
Есть еще одна возможная оговорка. Если твой https://mydomain.tld/foobar
страница использует любые ресурсы (скрипты, стили, изображения и т. д.), доступ к этим ресурсам также должен быть разрешен. Например, вы можете изменить условие, чтобы разрешить все, что начинается с /фубар
префикс с использованием если ($uri ~* ^/foobar) { перерыв; }
блокировать. Если их адреса нельзя проверить с помощью одного регулярного выражения, вы можете использовать несколько если (...) { перерыв; }
блоки.