Очень часто это является проблемой при построении редиректов, когда у вас больше 1 домена. Следующая конструкция выглядит работоспособной:
return 301 https://$server_name$request_uri;
Всё работает, когда у вас всего 1 домен в server_name. А когда 2 и больше, то для них redirect работает не правильно (он редиректит на самый первый домен в server_name). А всё потому, что нужно вместо $server_name использовать хост. В документации написано следующее:
- $server_name: имя сервера, принявшего запрос
- $host: в порядке приоритета: имя хоста из строки запроса, или имя хоста из поля “Host” заголовка запроса, или имя сервера, соответствующего запросу
То есть, в server_name будет подставляться имя сервера, то есть самый первый домен, прописанный в server_name.
Итого, правильный вариант:
return 301 https://$host$request_uri;
Проверить это можно, создав такой конфиг:
server { listen *:80; server_name test1.com test2.com; return 301 https://$host$request_uri; }
и сделав запросы:
# curl -Is http://test1.com | grep Location
Location: https://test1.com
# curl -Is http://test2.com | grep Location
Location: https://test2.com
Теперь, если подставить вместо $host -> $server_name, получим следующее:
# curl -Is http://test1.com | grep Location
Location: https://test1.com
# curl -Is http://test2.com | grep Location
Location: https://test1.com
Разница очевидна.