301 редирект на всі випадки життя за допомогою .htaccess

6 вересня 2024 р. 21 egor

301 редирект - постійний редирект, тобто 301 редирект вказує на те, що сторінка переміщена на нову адресу, а старий URL вважати застарілим, такий редирект передає близько 90-99% посилальної ваги сторінки.

Далі будуть описані кілька порад і приклади 301-го редиректу за допомогою файлу .htaccess

Поради

Намагайтеся уникати послідовних редиректів, тому що кожен редирект - це час завантаження сторінки і передача посилальної маси, а для пошукового робота - нечіткі команди.

Намагайтеся не робити редирект на сторінку, відповідь якої відмінна від коду 200. Тобто редирект має переадресовувати на наявну сторінку з відповіддю сервера код 200.

Браузери кешують редиректи, тому перевіряти їх краще за допомогою онлайн ресурсів.

301 редирект з однієї сторінки на іншу

Використовується коли сторінка переїхала з одного URL на інший. Наприклад старий URL сторінки /page-1/ необхідно зробити 301 редирект на URL http://mysite.com/new-page-1/

Redirect 301 /page-1/ http://mysite.com/new-page-1/

або

RewriteCond %{REQUEST_URI} ^/page-1/$
RewriteRule ^.*$ http://mysite.com/new-page-1/? [R=301,L]

301 редирект із www на домен без www

301 редирект домену з www на без www так само називається канонізацією домену або склейкою. Наприклад, робимо редирект із http://www.mysite.com на http://mysite.com, отже, головне дзеркало сайту це http://mysite.com

RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

або

RewriteCond %{HTTP_HOST} ^www\.mysite\.com [NC]
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]

301 редирект із домену без www на домен із www

Також як і у випадку, описаному вище, це ще називається канонізацією домену або його склеюванням. Наприклад 301 редирект з домену http://mysite.com на домен http://www.mysite.com, тобто головне дзеркало це www.mysite.com

RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]

або

RewriteCond %{HTTP_HOST} ^mysite\.com$ [NC]
RewriteRule ^(.*)$ http://www.mysite.com/$1 [R=301,L]

301 редирект зі сторінок зі слешем на сторінки без слешу в кінці URL

Часто буває так, що одна й та сама сторінка доступна за двома URL, наприклад /may-best-page та /my-best-page/, якщо людині зрозуміло, що це одна й та сама сторінка, то пошукові системи розуміють це як дві різні сторінки, відповідно розбивають вагу сторінки, а також показуються в аналітиці (статистиці) як 2 різні сторінки. Для того, щоб уникнути цього, ви можете зробити 301 редирект зі сторінок зі слешем у кінці URL на без нього.

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteRule ^(.*)\/$ /$1 [R=301,L]

Такий редирект працюватиме так:

Запит (URL) Редирект (URL)
http://mysite/page/ http://mysite/page
http://mysite/page/?value=1 http://mysite/page?value=1
http://mysite/page.html/ http://mysite/page.html
http://mysite/page?value=1/ http://mysite/page?value=1
http://mysite/page без редиректу
http://mysite/page.html без редиректу
http://mysite/page?value=1 без редиректу

301 редирект зі сторінок без слешу на сторінки зі слешем у кінці URL

Причина робити такий редирект та сама, що і в ситуації, описаній вище, за винятком того, що редирект необхідно робити зі сторінки без слешу в кінці URL на сторінку зі слешем у кінці URL

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

Приклад роботи редиректу:

Запит (URL) Редирект (URL)
http://mysite/page http://mysite/page/
http://mysite/page.html http://mysite/page.html
http://mysite/page?value=1 http://mysite/page/?value=1
http://mysite/page/ без редиректу
http://mysite/page/?value=1 без редиректу

301 редирект з усіх сторінок одного домену на головну сторінку іншого домену

Наприклад, вам необхідно зробити 301 редирект з будь-якого URL поточного сайт (до якого відноситься .htaccess) на домен http://mysite.com

RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ http://mysite.com/ [L,R=301]

301 редирект з кожної сторінки одного домену на таку саму URL адресу іншого домену

Для прикладу розглянемо ситуацію, коли ваш сайт переїхав на новий домен, але у вас є природне бажання зберегти користувачів, які переходять за старими посиланнями, і відкрити сайт на новому домені з потрібною користувачеві інформацією

RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ http://mysite.com/$1 [L,R=301]

301 редирект із протоколу http на протокол https

Якщо у вас на сайті є SSL сертифікат і працює протокол https, то для 301-го редиректу вам необхідно додати до .htaccess такий код:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

301 редирект із протоколу https на http

І зворотний приклад, якщо у вас немає SSL сертифіката і протокол https не працює:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

Видаляємо кілька слешів поспіль в URL і робимо 301 редирект

Якщо випадково у вас з'явилися URL такого виду: mysite.com/page///my-page, то можна зробити 301-й редирект без дублювання слешів:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

Видаляємо поспіль кілька тире (дефісів) і робимо 301 редирект

Як у ситуації з повторюваними слешами в URL може з'явитися кілька тире або дефісів, для 301-го редиректу з їхнім видаленням додаємо код:

RewriteCond %{REQUEST_URI} ^(.*)--(.*)$
RewriteRule . %1-%2 [R=301,L]

Вирізати index.php з URL

Приклад без GET параметрів, наприклад із mysite.com/index.php на mysite.com/

RewriteCond %{REQUEST_URI} /index.php
RewriteCond %{QUERY_STRING} ^\z
RewriteRule ^(.*)$ http://mysite.ru/? [R=301,L]

Приклад з GET параметрами, наприклад з mysite.com/index.php?value=1&p=3 на mysite.com/?value=1&p=3

RewriteCond %{REQUEST_URI} /index.php
RewriteRule ^(.*)$ http://mysite.ru/ [R=301,L]

Кілька прикладів поєднання 2-х редиректів в один

Для уникнення послідовних редиректів можна використовувати суміщені варіанти.

301 редирект з www на без www і зі слешем у кінці URL

Комбінуємо 301 редирект із www на домен без www та 301 редирект зі сторінок без слешу на сторінки зі слешем у кінці

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1/ [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)$ http://%1/$1/ [L,R=301]

301 редирект з без www на з www і зі слешем у кінці URL

Комбінуємо 301 редирект із домену без www на домен із www та 301 редирект зі сторінок без слешу на сторінки зі слешем у кінці URL

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://www.%1/$1/ [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)$ http://www.%1/$1/ [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]

301 редирект з без www на з www і без слешу в кінці URL

Комбінуємо 301 редирект із домену без www на домен із www та 3301 редирект зі сторінок зі слешем на сторінки без слешу в кінці URL

RewriteCond %{REQUEST_URI} ^\/$
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} \/$
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)\/$ http://www.%1/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} \/$
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)\/$ http://www.%1/$1 [L,R=301]

301 редирект з www на без www і без слешу в кінці URL

Комбінуємо 301 редирект із www на домен без www та 301 редирект зі сторінок зі слешем на сторінки без слешу в кінці URL

RewriteCond %{REQUEST_URI} ^\/$
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} \/$ 
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)\/$ http://%1/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} \/$
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)\/$ http://%1/$1 [L,R=301]