У меня есть 2 файла конфигурации nginx ssl.conf
и default.conf
под /etc/nginx/conf.d/
. Первый файл обрабатывает входящий HTTP-запрос. Он перезаписывает http-запрос на https. И ssl.conf
файл обрабатывает запросы на основе https.
Ниже показано, как default.conf
это выглядит как
server {
listen 80 default_server;
server_name abc.example.com 123-abc.example.com;
port_in_redirect off;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set_real_ip_from 127.0.0.1;
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
location /about {
root /usr/share/nginx/html;
add_header X-Frame-Options "DENY";
try_files $uri /about.html;
}
location /webapi {
add_header X-Frame-Options "DENY";
}
location / {
rewrite ^ https://$server_name$request_uri? permanent;
}
}
Проблема здесь в том, abc.example.com/to/some/path
переписывает на https://abc.example.com/to/some/path
Это ожидаемый результат.
Но
123-abc.example.com/to/some/path
также переписывает на https://abc.example.com/to/some/path
и НЕ https://123-abc.example.com/to/some/path
Я пытаюсь иметь 2 URL-адреса, которые работают одинаково, установив 2 разных server_names в качестве псевдонима. Они не предназначены для обслуживания разных страниц / веб-сайтов.
Вот ваше переписывание:
rewrite ^ https://$server_name$request_uri? permanent;
Проблема в том, что вы использовали $server_name
, который является не именем хоста HTTP, запрошенным браузером, а первым server_name
определено в server
блок.
Чтобы исправить это, измените его на $http_host
, которое является именем хоста, запрошенным браузером.
rewrite ^ https://$http_host$request_uri? permanent;
А еще лучше не использовать rewrite
вообще. Достаточно return 301
.
return 301 https://$http_host$request_uri$is_args$args;