Как заставить точное совпадение поддоменов с NGINX? - PullRequest
0 голосов
/ 11 июня 2019

Я использую Nginx в качестве обратного прокси.Он работает как контейнерный сервис в кластере Swarm.

Некоторое время назад я обнаружил это странное поведение и пытаюсь обернуть его вокруг.

На моем хосте у меня тринастройка поддоменов:

  • one.domain.com

  • two.domain.com

  • three.domain.com

В моей конфигурации сервера Nginx я указываю, что имя сервера, на которое я нацеливаюсь, - это three.domain.com, поэтому я ожидаю, что Nginx будет отвечать только на запросы, нацеленные на этоsubdomain.

events { worker_connections 1024; }

http {

  upstream service {
    server node:3000;
  }


  server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name three.domain.com;

    [...... ssl settings here.......]

    location / {

      proxy_pass http://service;
      proxy_set_header Host $host;
    }
  }

} 

То, что происходит вместо того, чтобы отвечать только на запросы, отправленные на three.domain.com, оно также отвечает на one.domain.com и two.domain.com.(он направляет их на three.domain.com)

Если я добавлю несколько серверных блоков, специально предназначенных для поддоменов один и два, он будет работать как положено, он направит запросы туда, где они принадлежат.

ТоПри этом идеальным поведением было бы отвечать только на субдомены, перечисленные в разделе server_name серверного блока.

1 Ответ

0 голосов
/ 11 июня 2019

Nginx проверяет поле заголовка запроса «Host» (или имя хоста SNI в случае https), чтобы определить, на какой сервер должен быть направлен запрос. Если его значение не совпадает ни с одним именем сервера, или запрос вообще не содержит этого поля заголовка, то nginx направит запрос на сервер по умолчанию для этого порта. В приведенной выше конфигурации сервер по умолчанию является первым (и единственным) сервером, что является стандартным поведением nginx по умолчанию. Если имеется несколько блоков server, также можно явно указать, какой сервер должен быть установлен по умолчанию, с параметром default_server в директиве listen

Итак, вам нужно добавить еще один server блок:

server {
    listen      443 ssl default_server;
    server_name default.example.net;
    ...
    return      444;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...