Как правильно сделать переадресацию http на https и www
Добавлено: 19 мар 2024, 15:10
С одной стороны, всё предельно понятно. Так как сайты массово перешли на https, то надо поисковикам явно указать на то, что главное зеркало находится по протоколу https. Но помимо этого всё также актуально, чтобы главным зеркалом был сайт с www (или без www, у кого как). Если этого не сделать, то возможна ситуация, когда роботы Яндекса будут ошибочно принимать за главное зеркало не тот адрес, который бы вам хотелось. И я озаботился этой проблемой всерьёз как раз из-за того, что в Яндекс Вебмастер у меня самопроизвольно поменялось главное зеркало.
Я раньше думал, что надо через htaccess поставить 301 переадресацию на https и www, выбрать в переезде сайта (через Яндекс Вебмастер) нужный вариант адреса и уже после нужной склейки убрать эти директивы. Но как оказалось, переадресация должна быть всегда, иначе спустя время роботы Яндекса могут опять изменить главное зеркало сайта. У меня случилось именно так. Убрал же переадресацию я из-з боязни, что при заходе на сайт не корректно будут отработаны правила для красивых ссылок, которые ссылаются на скрипты. Напрасно.
Другой момент заключается в том, что только переадресаций на https есть несколько вариаций. И это сбивает с толку, так как в одном месте дают один вариант, в другом - другой. А в справке Яндекса и вовсе нет вариантов, а лишь указано, что надо сделать 301 или 302 переадресацию, а дальше всё упирается в хостинг. Яндекс понять можно, ведь хостинги разные и под разными операционными системами, с разным окружением. И чтобы у всех работало корректно, надо обращаться к своим хостинг провайдерам. Но и тут не всё так просто, так как поддержка хостинг провайдеров пользуется тем же справочным материалом и также вынуждена выбирать среди вариантов. И хорошо, если с подобным вопросом уже обращались, а они помогали. У некоторых хостеров есть База знаний, но она скорее для виртуального хостинга. А если у вас VPS или выделенный сервер, то там может быть всё что угодно, ведь вы решаете, как настроить хостинг и какую панель поставить для управления этим хостингом.
Но вернёмся к моей ситуации. Мне хостер предложил такой вариант:
# Редирект с http на https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Но на одном VPS у меня это сработало, а на другом (у меня два VPS на совершенно двух разных хостингах) привело к ошибке:
Страница недоступна
Сайт выполнил переадресацию слишком много раз.
Попробуйте удалить файлы cookie.
ERR_TOO_MANY_REDIRECTS
Стал пробовать альтернативы и на одном из сайтов нашёл совет, что если происходит зацикливание, то можно попробовать так:
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Поменял и всё заработало без ошибок. Что интересно, на первом хостинге этот вариант тоже заработал. Тогда взял его за основу, но повторюсь, что так и не знаю, лучший ли это вариант, но работает корректно - это факт.
Но дальше мне надо было сделать переадресацию на www, так как хотел, чтобы главным зеркалом был сайт www.мой_домен.ru. Много лет до этого за это отвечала директива host в файле robots.txt, но с недавнего времени Яндекс, а точнее его роботы эту директиву не поддерживают и даже игнорируют. Нужен был новый способ и в итоге решение было также через htaccess:
# Редирект с не-www на www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
И тоже заработало, причём на обоих хостингах. Осталось лишь объединить:
# Редирект с http на https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Редирект с не-www на www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Работает без ошибок на двух VPS. Но допускаю, что можно как-то объединить эти строки или упростить. Другой вопрос - надо ли. И тут был бы рад услышать мнение специалистов, кто в этом понимает лучше или касался этого вопроса и досконально разобрался.
Я раньше думал, что надо через htaccess поставить 301 переадресацию на https и www, выбрать в переезде сайта (через Яндекс Вебмастер) нужный вариант адреса и уже после нужной склейки убрать эти директивы. Но как оказалось, переадресация должна быть всегда, иначе спустя время роботы Яндекса могут опять изменить главное зеркало сайта. У меня случилось именно так. Убрал же переадресацию я из-з боязни, что при заходе на сайт не корректно будут отработаны правила для красивых ссылок, которые ссылаются на скрипты. Напрасно.
Другой момент заключается в том, что только переадресаций на https есть несколько вариаций. И это сбивает с толку, так как в одном месте дают один вариант, в другом - другой. А в справке Яндекса и вовсе нет вариантов, а лишь указано, что надо сделать 301 или 302 переадресацию, а дальше всё упирается в хостинг. Яндекс понять можно, ведь хостинги разные и под разными операционными системами, с разным окружением. И чтобы у всех работало корректно, надо обращаться к своим хостинг провайдерам. Но и тут не всё так просто, так как поддержка хостинг провайдеров пользуется тем же справочным материалом и также вынуждена выбирать среди вариантов. И хорошо, если с подобным вопросом уже обращались, а они помогали. У некоторых хостеров есть База знаний, но она скорее для виртуального хостинга. А если у вас VPS или выделенный сервер, то там может быть всё что угодно, ведь вы решаете, как настроить хостинг и какую панель поставить для управления этим хостингом.
Но вернёмся к моей ситуации. Мне хостер предложил такой вариант:
# Редирект с http на https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Но на одном VPS у меня это сработало, а на другом (у меня два VPS на совершенно двух разных хостингах) привело к ошибке:
Страница недоступна
Сайт выполнил переадресацию слишком много раз.
Попробуйте удалить файлы cookie.
ERR_TOO_MANY_REDIRECTS
Стал пробовать альтернативы и на одном из сайтов нашёл совет, что если происходит зацикливание, то можно попробовать так:
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Поменял и всё заработало без ошибок. Что интересно, на первом хостинге этот вариант тоже заработал. Тогда взял его за основу, но повторюсь, что так и не знаю, лучший ли это вариант, но работает корректно - это факт.
Но дальше мне надо было сделать переадресацию на www, так как хотел, чтобы главным зеркалом был сайт www.мой_домен.ru. Много лет до этого за это отвечала директива host в файле robots.txt, но с недавнего времени Яндекс, а точнее его роботы эту директиву не поддерживают и даже игнорируют. Нужен был новый способ и в итоге решение было также через htaccess:
# Редирект с не-www на www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
И тоже заработало, причём на обоих хостингах. Осталось лишь объединить:
# Редирект с http на https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Редирект с не-www на www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Работает без ошибок на двух VPS. Но допускаю, что можно как-то объединить эти строки или упростить. Другой вопрос - надо ли. И тут был бы рад услышать мнение специалистов, кто в этом понимает лучше или касался этого вопроса и досконально разобрался.