Для блока http:
Благодаря HSTS обслуживает только клиентов, посещающих в первый раз.Таким образом, вы можете использовать простое перенаправление и выполнить удаление www.
в блоках https.
Например:
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
Если вы хотите удалить префикс www.
на этом этапе,вам нужно регулярное выражение, которое всегда будет совпадать.
Например:
server {
listen 80;
listen [::]:80;
server_name ~^(www\.)?(?<domain>.+)$;
return 301 https://$domain$request_uri;
}
Подробнее см. в этом документе .
Дляблоки https:
Вам нужно регулярное выражение для захвата этой части имени домена после www.
.У вас есть два варианта:
Использовать два блока server
(как у вас сейчас), но не ставить подстановочный оператор server_name
во втором блоке.Вы можете использовать другое регулярное выражение (например, server_name ~example\.com$;
) или вообще не указывать server_name
и установить его по умолчанию.
Например:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ~^www\.(?<domain>.+)$;
# ssl config...
return 301 https://$domain$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
# no server_name statement needed
...
}
Или использовать одно server
заблокируйте и протестируйте переменную $http_host
, используя оператор if
.
Например:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name .example.com;
if ($http_host ~ ~^www\.(.+)$) { return 301 https://$1$request_uri; }
...
}
См. это предупреждение об использовании if
.