Макет конфигурации Nginx для перенаправления IP

Я добавил сертификат SSL на свой сайт, и у меня есть файл конфигурации, который выглядит следующим образом:

server {
    listen 80;
    listen [::]:80;

    server_name www.default.com default.com;
    return 301 https://default.com$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name default.com;

   ...
}

У меня было несколько клиентов, просматривающих промежуточный сайт по IP-адресу сервера , поэтому, например, я бы попросил их взглянуть на несколько изменений на http://123.123.123.123

Теперь, когда IP-адрес был предоставлен нескольким сотням людей, а добавление SSL нарушило Айпи адрес' ссылка Я хочу перенаправить ее на доменное имя.

Могу ли я добавить перенаправление в верхний блок или создать третий блок?

Например:

server {
    listen 80;
    listen [::]:80;

    server_name www.default.com default.com;
    return 301 https://default.com$request_uri;
}

server {
    listen 80;
    listen 123.123.123.123:80;

    server_name 123.123.123.123;
    return 301 https://default.com$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name default.com;

   ...
}

Выглядит правильно? Это моя первая конфигурация nginx, которую я когда-либо делал - я погуглил макет перенаправления, но я не уверен, должен ли он помещаться в отдельный блок или нет.

0
задан 1 December 2016 в 12:10
2 ответа

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

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 default_server ssl;
    listen [::]:443 default_server ssl;
    server_name localhost;

    root /var/empty;
    return 301 https://default.com$request_uri;
}

Думайте об этом блоке сервера как о резервном варианте, который также использует имя сервера 'localhost'. Так что вы не можете использовать это имя позже. Ваш третий блок (теперь второй блок) имеет те же свойства соответствия, что и первый для порта 443, но указывает другое имя хоста. Когда клиент отправляет правильное имя хоста, этот блок сервера является более точным совпадением и, как таковой, отменяет резервный вариант.

Когда клиент подключается через порт 80, более точного совпадения нет, поэтому применяется резервный вариант.

Когда он подключается к порту 443, но отправляет другое имя хоста, nginx видит default_server и поэтому игнорирует имя_сервера для сопоставления.Все ответы, содержащие имя хоста, будут использовать имя_сервера , а переменная $ host , которая может быть включена в журналы, будет использовать это имя.

Обратите внимание, что я предпочитаю использовать default_server вместо того, чтобы полагаться на порядок блоков сервера.

Наконец, перенаправление на порт 443 будет работать только , если ваш сертификат покрывает имя хоста, которое отправляет клиент. В противном случае квитирование SSL / TLS не удастся, прежде чем HTTP-часть даже вступит в игру. Поскольку у нас есть letsencrypt , проблем быть не должно. Вы можете просто использовать их сертификат для любого действительного или объявленного имени хоста и использовать подтвержденный сертификат для своего официального сайта.

1
ответ дан 4 December 2019 в 16:25

Примечание: «VirtualHost» - это термин Apache. NGINX не имеет виртуальных хостов, у него есть «серверные блоки», которые используют имя_сервера и директивы прослушивания для привязки к TCP-сокетам.

https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks

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

Например, это улучшенная конфигурация

server {
    listen 80;
    listen [::]:80;

    listen 443 ssl;
    listen [::]:443 ssl;

    # Add SSL stuff here.

    server_name www.default.com default.com;
}

server {
    listen 80;
    # Add SSL stuff, if you want to redirect from HTTPS via IP to Domain, too.

    server_name 123.123.123.123;
    return 301 https://default.com$request_uri;
}
0
ответ дан 4 December 2019 в 16:25

Теги

Похожие вопросы