Поради
Намагайтеся уникати послідовних редиректів, тому що кожен редирект - це час завантаження сторінки і передача посилальної маси, а для пошукового робота - нечіткі команди.
Намагайтеся не робити редирект на сторінку, відповідь якої відмінна від коду 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]