Рейтинг:0

Как сделать перенаправление nginx без IP-адреса и пути?

флаг fr

Мне нужно перенаправить на URL-адрес, если только пользователь не приходит с нашего внутреннего IP-адреса. или же если они обращаются к определенному пути.

Я пробовал это:

расположение ~* /foobar {
    сломать;
}

местоположение ~* / {
    если ($remote_addr!= 111.222.333.444) {
        переписать ^ https://external.tld/
    }
}

Но это, кажется, не работает. Эта конкретная конфигурация вызывает ошибку 404 при переходе к https://mydomain.tld/foobar и «Добро пожаловать в nginx!» страницу при доступе к ней с нашего IP-адреса. Тем не менее, доступ https://mydomain.tld/foobar вне нашего IP-адреса правильно перенаправляет на https://внешний.tld/

djdomi avatar
флаг za
Вопросы по установке, настройке или диагностике должны включать желаемое конечное состояние, конкретную проблему или ошибку, достаточную информацию о конфигурации и среде для ее воспроизведения, а также попытки решения. Вопросы без четкой формулировки проблемы бесполезны для других читателей и вряд ли получат хорошие ответы.
Darrell Brogdon avatar
флаг fr
@djdomi Что вы порекомендуете, чтобы сделать постановку задачи более ясной?
djdomi avatar
флаг za
покажите нам nginx -T и объясните, что значит не работает, в настоящее время вы просто говорите нам половину пути;)
Darrell Brogdon avatar
флаг fr
@djdomi Спасибо. Я добавил больше пояснений к тому, что происходит с данной конфигурацией. К сожалению, мне не разрешено публиковать результаты `nginx -T`.
djdomi avatar
флаг za
если это только один URL-адрес, возможен ли поддомен?
Darrell Brogdon avatar
флаг fr
Нет, только один URL.
Рейтинг:1
флаг gr

Поскольку вы не хотите (или вам не разрешено) показывать весь блок вашего сервера, я сделаю несколько предположений. Что, скорее всего, произошло с вашей конфигурацией? Вы создали два дополнительных блока местоположения, которые используются для обработки Любые входящий запрос. Проверить место расположения директива документация. Единственными двумя типами местоположения, которые могут перехватить запрос от местоположения, совпадающего с регулярным выражением, являются точное местоположение (расположение =/ури {...}) и местоположение префикса "не проверять регулярное выражение" (местоположение ^~ / префикс { ... }). В противном случае будет выбрано первое совпадение с регулярным выражением.

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.