Я обслуживаю сайт от 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-го сервера, и это, вероятно, удалило бы предупреждение, но мне пришлось бы скопировать весь контент блок сервера тоже, что я считаю излишним.
Есть ли лучшее решение?