Способи оплати Abuse

Як зробити редирект з WWW на без WWW у Nginx

22.02.2022, 20:05


З метою оптимізації сайту за правилами SEO у нього має бути один домен. Піддомен з www вважається окремим доменом, у тому разі, якщо він буде недоступний, це призведе до появи дублів контенту. Що це означає? Дублі - небажані елементи, які часто стають причиною зниження позицій сайту у видачі пошукових систем. Ось чому варто робити редирект із домену www на без www. Так, на початку піддомен www використовувався з метою позначення сервера, що він не може розгорнути веб-сервер і розміщений сайт. Зараз у цьому відпала необхідність. У цій статті ми розглянемо як зробити редирект з www на без www Nginx.

Як зробити редирект без WWW у NGINX

Найпростіший спосіб - зробити редирект у Nginx для www домену - це створити окрему секцію server для нього і вже звідти виконувати редирект. Наприклад:

server {
server_name www.losst.ru;
return 301 $scheme://losst.ru$request_uri;
}

У тому випадку, коли необхідно позначити обробку www і не www в одній секції server, можна використовувати умову і регулярний вираз. Коли на початку змінної хост містяться літери www, то потрібно повернути код відповіді 301 і посилання на, на яке слід перенаправити користувача:

if ($host ~* ^www.(.*)$) {
return 301 $scheme://$server_name$request_uri;
}

Код слід додати в секцію server сайту, для якого слід налаштувати редирект. Якщо ж ви використовуєте SSL сертифікат LetsEncrypt, для його генерації потрібне підтвердження www домену, так і для не www. Для запиту підтвердження має повертатися відповідь, а не редирект. Для цього можна створити змінну $need_redirect, а потім змінювати її значення кількома умовами:

set $need_redirect "0";
if ($host ~* ^www.(.*)$) {
set $need_redirect "1";
}
if ($request_uri ~* "well-known") {
set $need_redirect "0";
}
if ( $need_redirect ~ "1") {
return 301 https://$server_name$request_uri;

Коли URL містить слово well-known, яке використовується в запиті підтвердження домену для SSL-сертифіката, редирект не виконається. Збережіть налаштування. Збережіть налаштування і перезапустіть Nginx:

nginx -s reload

Або:

sudo systemctl restart nginx

Після цього можна перевірити, чи працює редирект за допомогою curl:

curl -I www.losst.ru

Редирект повертатиметься, у полі Location є URL, куди треба перенаправити користувача. Але якщо спробувати звернутися до URL від LetsEncrypt, то редиректу не буде:

curl -I https://www.losst.ru/.well-known/acme-challenge/xxxxxxxxxxxxxxxxxxxxxxx

Усе працює за планом, як і очікувалося. На цьому інструкцію можна вважати завершеною.