2

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

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

1 ответ1

1

Опция 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 не должен совпадать, используя server_name как он будет соответствовать всему, что первый блок server не соответствует явно.

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