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

В Nginx сопоставьте определенные поддомены с портами, перенаправьте все остальные

Я пытаюсь выполнить три задачи:

  1. Сопоставьте трафик по субдоменам с одним из нескольких приложений на разных портах.
  2. Если поддомен не распознается, перенаправьте на www.
  3. Требовать HTTPS на всех поддоменах.

Моя конфигурация nginx пока что:

map $subdomain $subdomain_port {
  default    8000;
  www        8000;
  subdomain1 8001;
  subdomain2 8002;
  subdomain3 8003;
}

server {
    listen 80;
    listen [::]:80;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    listen              443 ssl;
    server_name         ~^(?P<subdomain>.+?)\.mydomain\.com$;

    ssl_certificate     <cert>;
    ssl_certificate_key <key>;

    location / {
      # ... various proxy headers, then ...
      proxy_pass http://127.0.0.1:$subdomain_port;
      proxy_redirect off;
    }
}

это почти работает (выполняет # 1 и # 3), но вместо перенаправления foo.mydomain.com к www.mydomain.com, это просто служит www контент без перенаправления. Я не уверен, как перенаправить несопоставленные поддомены, не разбивая все это на отдельные server блоки, которых я бы не стал делать.

Есть ли способ перенаправить все поддомены, явно не упомянутые на карте, на www?

Просто чтобы сказать, что на AWS мне нужно было добавить запись A «* .staging.mydomain.com» в Route53, указывающую на тот же IP-адрес экземпляра EC2 (например, запись для «staging.mydomain.com»)

Просто создайте сервер по умолчанию. Вот мой

server {
  listen      80 default_server;
  server_name _;
  return 302 https://www.example.com;
}

Вы можете делать все, что захотите.

Следующее работает для меня ...

  1. Пусть порт по умолчанию будет отличаться от порта для www.
  2. Пусть Nginx прослушивает порт по умолчанию и перенаправляет весь трафик на www.

Вот изменения в конфигурации Nginx, чтобы он работал ...

map $subdomain $subdomain_port {
  default    8888;
  www        8000;
  subdomain1 8001;
  subdomain2 8002;
  subdomain3 8003;
}

server {
    listen 8888;
    server_name _;
    return 301 https://www.domainname.com/$request_uri;
}

# other configs remain the same

Я использовал 8888 как порт по умолчанию. Любой неиспользуемый порт должен работать.