![NGINX: перенаправление localhost на _](https://rvso.com/image/782624/NGINX%3A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20localhost%20%D0%BD%D0%B0%20_.png)
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
для цели перенаправления. Вы можете назначить свое основное доменное имя в качестве цели перенаправления, например.