NGINX: перенаправление localhost на _

NGINX: перенаправление localhost на _

nginx версия/1.18.0 (Ubuntu) — Ubuntu 22.04.01 LTS x86_64 ядро ​​6.0.8


У меня есть сервер (спецификации установки приведены выше) с несколькими именами хостов, на котором запущен nginx, и все работает (включая nginx с перенаправлениями с http: на https:).

На самом деле, вот как я это делаю на своем сервере по умолчанию:

listen 80 default_server;

listen 443 default_server ssl;
# force https-redirects
if ($scheme = http) {
  return 301 https://$host$request_uri;
}

server_name _;

Вот странное поведение:

URL Перенаправляет на Примечания
http://mumblefrotz/ https://mumblefrotz/ (работает как и ожидалось)
http://mumblefrotz.fullyqualified.com/ https://mumblefrotz.fullyqualified.com/ (работает как и ожидалось)
http://127.0.0.1/ https://127.0.0.1/ (работает как и ожидалось)
http://localhost/ https://_ ОТКАЗ

Почему он это делает? Я подозреваю, что это как-то связано сserver_nameдиректива понимается буквально, хотя я не совсем уверен, почему это происходит только для localhost.

Глядя наэто предложение Stack Overflow, я попробовал оба варианта и все равно получил удивительное подчеркивание:

  • server_name ~.;
  • server_name ~^(.+)$;

Я ожидаю, что $hostэтоимя хоста, переданное в HTTP-запросе, при этом виртуальный хост подхватывает его, если он был определен, и возвращается к определению сервера по умолчанию, если нет.

Насколько я могу судить, http://localhost/это единственный, который не разрешается должным образом. Я бы хотел это исправить.

решение1

Не было никакой информации по вопросу, какой клиент был использован для выполнения запроса. Как написано вдокументация nginx, $hostпеременная содержит:

в следующем порядке приоритета: имя хоста из строки запроса, или имя хоста из поля заголовка запроса «Хост», или имя сервера, соответствующее запросу

Здесь «строка запроса» означает имя хоста после GETглагола в HTTP-запросе.

Второе означает Hostполе заголовка.

Третье означает имя, настроенное в server_name.

В вашем случае, я думаю, что тестовый клиент сделал запрос, который не содержал Hostзаголовка. Поэтому nginx использовал server_nameконфигурацию для содержимого $hostпеременной.

Лично я просто генерирую блок HTTP -> HTTPS forward для каждого виртуального сервера, поскольку я управляю конфигурациями nginx с помощью Ansible. Таким образом, я могу иметь vhost return 404для всех других имен хостов, которые мне не интересны.

Но если вам необходимо реализовать общий виртуальный хост для перенаправлений, вы можете использовать следующий подход:

map $http_host $redirect_host {
    ~ (^.+$) $http_host;
    default  example.com;
}

server {
    listen 80 default_server;
    ...

    if ($scheme = http) {
        return 301 https://$redirect_host$request_uri;
    }
}

Это всегда использует заголовок HTTP-хоста для цели перенаправления, за исключением случаев, когда заголовок отсутствует Host. В этом случае он использует example.comдля цели перенаправления. Вы можете назначить свое основное доменное имя в качестве цели перенаправления, например.

Связанный контент