У меня есть стандартная установка nginx на Ubuntu 12.04. Я хочу, чтобы обслуживал только один поддомен. Все остальные должны вернуть 404.

Я определил два сайта:

0 по умолчанию:

server {
  listen *:80 default_server;
  listen [::]:80 default_server ipv6only=on;
  listen *:443 default_server ssl;
  listen [::]:443 default_server ssl ipv6only=on;

  return 404;

  ssl_certificate /etc/nginx/ssl/mydomain.com.pem;
  ssl_certificate_key /etc/nginx/ssl/mydomain.com.key; 

  server_name _ *.mydomain.com mydomain.com;
}

1-сайт:

server {
  listen sub.mydomain.com:443;

  ssl                  on;
  ssl_certificate      /etc/nginx/ssl/sub.mydomain.com.pem;
  ssl_certificate_key  /etc/nginx/ssl/sub.mydomain.com.key;

  root /var/www/sub;
  index index.html index.htm;

  server_name sub.mydomain.com;
}

Но 1-сайт обслуживает все домены на порту 443, а не только sub.mydomain.com и не обслуживается по умолчанию 0.

Как я могу добиться желаемого поведения?

2 ответа2

1

Теперь у меня есть объяснение.

Ваш 1-сайт-сервер прослушивает ip:port то время как сайт по умолчанию прослушивает только port . Когда nginx выбирает, какой блок сервера использовать, он предпочитает наиболее близкое совпадение, а ip:port лучше, чем port . И только после этого просеивания nginx будет сравнивать имена серверов, но в этом случае уже слишком поздно. Это уже только один кандидат.

После выравнивания вашего оператора прослушивания все они "равноудалены" от запроса.

0

Я мог бы решить это, выровняв операторы listen.

Таким образом, мои заявления прослушивания выглядят теперь следующим образом:

0 по умолчанию:

 listen 80 default_server;
 listen 443 default_server ssl;

1-сайт:

 listen 443;

Субдомен в операторе прослушивания, похоже, сбивал с толку nginx.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .