Nginx: как избежать предупреждения о дублировании имени сервера

385
Chaos_99

Я обслуживаю сайт от nginx, который доступен как с внутренними именами хостов, так и с внешними. Я хочу заставить внешний доступ использовать https, но сохраняю http для внутреннего доступа (потому что я не могу получить сертификаты для этих внутренних адресов).

Следующая конфигурация делает то, что я хочу:

#redirect port 80 http to 443 https server{ listen 80 default_server; listen [::]:80 default_server; #just for external access server_name hostname.external_domain; return 301 https://$host$request_uri; }  # serve both http and https internally server { listen 80; listen 443 ssl; listen [::]:80; listen [::]:443 ssl;  server_name hostname hostname.internal_domain hostname.external_domain;  ... 

но nginx -tдает мне предупреждение

nginx: [warn] conflicting server name "hostname.external_domain" on 0.0.0.0:80, ignored 

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

Я знаю, что мог бы добавить 3-е определение сервера только с портом 443 и без порта 80 для hostname.external_domainи удалить только это имя со 2-го сервера, и это, вероятно, удалило бы предупреждение, но мне пришлось бы скопировать все содержимое блока сервера тоже, что я считаю излишним.

Есть ли лучшее решение?

2

1 ответ на вопрос

1
Richard Smith

Опция 1.

Используйте три serverблока (как уже упоминалось в вашем вопросе), но выгрузите дублированный контент в отдельный файл, используя includeдирективу, чтобы вставить его в каждый из соответствующих serverблоков. Смотрите этот документ для деталей.


Вариант 2

default_serverНе нуждается в server_nameзаявлении. Однако вы должны поменять местами default_serverдругой serverблок, чтобы первый serverблок стал более конкретным.

Например:

server{ listen 80; listen [::]:80; server_name hostname.external_domain; return 301 https://$host$request_uri; }  server { listen 80 default_server; listen 443 ssl default_server; listen [::]:80 default_server; listen [::]:443 ssl default_server;  ... } 

Второму server_blockне нужно сопоставлять, используя a, так server_nameкак оно будет соответствовать чему-либо, что в первом serverблоке не совпадает явно.