Мне не удалось найти вопрос, который соответствует моему конкретному сценарию, поэтому, надеюсь, это не дубликат, если да, то прошу прощения.
У меня есть 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.