[nginx] rewrite: $host or $server_name

Очень часто это является проблемой при построении редиректов, когда у вас больше 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

Разница очевидна.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *