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

NGINX перенаправляет все домены на один, но не на собственные публичные и частные IP-адреса сервера

Мне не удалось найти вопрос, который соответствует моему конкретному сценарию, поэтому, надеюсь, это не дубликат, если да, то прошу прощения.

У меня есть 4 веб-сервера за балансировщиком нагрузки. Я хочу, чтобы работали только www.mydomain.com, 123.123.123.123 (общедоступный IP-адрес моего сервера) и 456.456.456.456 (IP-адрес внутренней сети моего сервера), все остальное должно перенаправлять на www.mydomain.com.

Зачем? Мне нужно отправить все на www.mydomain.com, потому что у нас были люди, настраивающие другие домены (www.otherdomain.com), указывающие на наш IP-адрес, поэтому он действует как зеркало нашего сайта. Мы не знаем, почему они это делают, но Google начинает сканировать их сайт, как будто это совершенно другой сайт, и это вызывает проблемы. Мне нужно разрешить IP-адреса сервера, потому что мы используем это для внутренней болтовни сервера через настраиваемый API, чтобы обойти балансировщик нагрузки.

Единственные решения, которые я смог найти, либо перенаправляют все, ВКЛЮЧАЯ IP-адреса, на www.mydomain.com, либо они ничего не перенаправляют.

Вот моя текущая конфигурация (для простоты обрезана):

server {
    listen 80;
    server_name www.mydomain.com 123.123.123.123 456.456.456.456;
}

server {
    listen 80 default;
    server_name _;
    rewrite ^ http://www.mydomain.com$request_uri?;
}

Ожидаемый: запросы к правильному домену или любому IP-адресу соответствуют первому правилу. Все остальные запросы соответствуют второму правилу и перенаправляются. Фактически: вообще ничего не перенаправляется, я предполагаю, потому что NGINX просто сопоставляет IP-адрес независимо от домена с первым правилом. Также может быть, что балансировщик нагрузки все испортил? Я использую облачный балансировщик нагрузки Rackspace, если это помогает.

Я также пробовал эту конфигурацию:

server {
    listen 80 default;
    server_name www.mydomain.com;
}

server {
    listen 80;
    server_name _;
    rewrite ^ http://www.mydomain.com$request_uri?;
}

Это дает те же результаты, что и предыдущее. Кажется, ничего не перенаправляется.

Есть идеи, как я могу это исправить?

Спасибо за вашу помощь!

У меня все заработало. Самир был близок, но я не уверен, что он правильно понял мой вопрос. Это решение моей проблемы;

server {
    listen 80;
    server_name www.mydomain.com 123.123.123.123 456.456.456.456;
}

server {
    listen 80 default_server;
    server_name _;
    rewrite ^ http://www.mydomain.com$request_uri?;
}

С помощью вышесказанного вы можете загрузить сайт через www.mydomain.com или прямые внутренние и общедоступные IP-адреса, но если вы попытаетесь загрузить его любым другим способом, вы будете перенаправлены.

Как ни странно ... Это первый пример, который я пробовал выше. Я не знаю, почему это не сработало тогда и работает сейчас. Возможно, потому, что "listen 80 default" устарел в пользу "listen 80 default_server". Или, возможно, я запутался, что будет тестировать все 4 узла. В любом случае, похоже, сейчас это определение работает!

server {
    listen 456.456.456.456:80;
    server_name mydomain.com;
    # I am more lenient with internal and this will bypass the LB
}

server {
    listen 80 default;
    server_name _;
    if ($host != www.mydomain.com){
        rewrite ^ http://www.mydomain.com$request_uri?;
    }
}

Если внутреннее и внешнее не отличаются, вы можете отказаться от первого раздела сервера. В идеале вас должен беспокоить только заголовок $ host, который является стандартным заголовком HTTP. С HTTP loadbalancer вы должны использовать IP-адрес балансировщика нагрузки, а не общедоступный IP-адрес вашего компьютера, потому что это обойдет LB.