ЯК ЗРОБИТИ 301-РЕДИРЕКТ У ФАЙЛІ .HTACCESS? ПРИКЛАДИ ТА ПРАВИЛА НАЛАШТУВАННЯ
ЩО ТАКЕ 301 РЕДИРЕКТ?
Загальне визначення
Код стану HTTP 301 або Moved Permanently («Переміщено назавжди») — стандартний код відповіді сервера, який можна отримати, якщо запитана URL-адреса сайту була назавжди перенесена в нове місце розташування.
Вступ. Правила наведено для сервера Apache. У правилах: %{QUERY_STRING} — означає фрагмент URL-адреси після знака запитання (завдання значень CGI-параметрів). Спрацювання того чи іншого правила для редиректу визначається тим, чи попадає URL-адреса сторінки під це правило чи ні. Про значення тих чи інших позначень (^, $, NC тощо).
Перевірте код відповіді. Швидка та безкоштовна перевірка кодів відповіді для списку URL у режимі онлайн реалізована в рамках комплексу інструментів , передбачене зручне кодування кольорів та завантаження URL файлом.
НАЙБІЛЬШ ВИКОРИСТОВУВАНІ ПРАВИЛА
Нижче наведені правила налаштування файлу .htaccess для 301-редиректа. Краще розміщувати всі правила після двох рядків:
Options +FollowSymLinks
RewriteEngine On
Коментар у файлі позначається символом ґрати «#» на початку рядка
# Текстовий коментар, цей рядок не буде оброблятися.
301-редирект з домену без WWW на домен з WWW префіксом
RewriteCond %{HTTP_HOST} ^site\.ua$ [NC]
RewriteRule ^(.*)$ http://www.site.ua/$1 [R=301,L]
З домену з WWW префіксом на без
RewriteCond %{HTTP_HOST} ^www.site\.ua$ [NC]
RewriteRule ^(.*)$ http://site.ua/$1 [R=301,L]
Для HTTPS-версії:
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://pixelplus.ua/$1 [R=301,L]
Стандартна переадресація з однієї статичної сторінки на іншу
Redirect 301 /was.php http://www.site.ua/new.php
При цьому нову адресу вказувати необхідно повністю з http та доменним ім’ям.У ряді випадків корисна переадресація через RewriteRule
RewriteRule ^dir /dir-new/$1 [R=301,L]
301-редирект для сторінки з параметрами GET
Скажімо, адреса сторінки має вигляд: http://www.site.ua/dir/index.php?IBLOCK_ID=1&SECTION_ID=111 тоді для налаштування 301 переадресації на нову адресу, необхідно використовувати таке правило:
RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=111$ [NC]
RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]
Якщо один (або декілька) GET параметрів не заданий(и) або може мати довільне значення (у нашому прикладі це SECTION_ID ), можна використовувати наступний код:
RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=(.*)$ [NC]
RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]
301-редирект зі сторінки без заданого параметра в корінь
Якщо адреса має такий вигляд: http://www.site.ua/?abc то для перенаправлення підійде послідовність рядків:
RewriteCond %{QUERY_STRING} ^abc$ [NC]
RewriteRule ^$ /? [R=301,L]
301-редирект для конкретного файлу, а не цілої папки
Якщо потрібно налаштувати переадресацію тільки для адреси http://www.site.ua/dir/ , але при цьому щоб сторінка http://www.site.ua/dir/index.php?IBLOCK_ID=1 відкривалася за старою адресою, необхідно використовувати спецсимвол $ у правилі.
RewriteRule ^dir/$ http://www.site.ua/new-dir/ [R=301,L]
Як бути з доменами у зоні UA?
Для доменів у зоні UA діють ті самі правила, але тільки всі кирилиці необхідно замінити на альтернативний код (він на латиниці).
RewriteCond %{HTTP_HOST} ^old-site\.ua$ [NC]
RewriteRule ^(.*)$ http://www.site.ua/$1 [R=301,L]
Налаштування переадресації на папки зі слішем наприкінці /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..{1,10}$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.site. ru/$1/ [L,R=301]
Налаштування переадресації на папки без слєшу (прибираємо слєш наприкінці)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ http://www.site.ua/$1 [R=301,L]
301-редирект з домену на папку на іншому домені
RewriteCond %{HTTP_HOST} ^si-te\.ua$ [NC]
RewriteRule ^(.*)$ http://www.site.ua/si-te/ [R=301,L]
Редирект з усіх файлів домену, крім папки адміністратора bitrix
RewriteRule ^bitrix/ /bitrix/admin/ [L,R=301]
RewriteRule ^(.*)$ http://www.newsite.ua/new/ [L,R=301]
Редирування всіх файлів у папці на заданий файл
RewriteRule ^dir(.*)$ /new-file.php [L,R=301]
Редирект файлів із заданої папки крім певного файлу
RewriteRule ^dir/no-file.html /no-file-new.html [L,R=301]
RewriteRule ^dir(.*)$ /all.php [L,R=301]
Зміна сторінок з html розширення на php розширення
RedirectMatch 301 (.*)\.html$ http://www.new-site.ua$1.php
Перенесення картинок / зображень з папки /img/ на піддомен
RewriteRule ^img/(.+)\.jpg$ http://img.domain.ua/$1.jpg [R=301,L]
Завдання типу індексної сторінки (php, html, htm та інші)
Вказується порядок завантаження типів індексного файлу, які у корені каталогу.
DirectoryIndex index.html index.php index.htm index.shtml
Редирект з індексної сторінки php на саму папку (корінь)
RewriteCond %{THE_REQUEST} ^[AZ]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.site.ua/ [R=301,L]
Для всіх індексних сторінок на сайті:
RewriteRule ^(.*)index\.php$ http://www.site.ua/$1 [R=301,L]
Редирект із піддомену на основний домен другого рівня
RewriteCond %{HTTP_HOST} ^test.site.ua$ [NC] RewriteRule ^(.*)$ http://site.ua%{REQUEST_URI} [R=301,NC,L,QSA]
Редирект для заданого файлу в різних директоріях (папках)
RewriteRule [^abc]/unique-file.html /unique-file.html [R=301,L]
Код дозволяє поставити 301-редирект з усіх папок виду http://site.ua/***/uniqe-file.html на один файл у корені /unique-file.html. Буває корисним при переробці сайту та зміні посилань.Якщо потрібно створити ЧПУ-копію будь-якої динамічної сторінки, це можна також реалізувати за допомогою .htaccess.
RewriteRule ^testovyi/test/?$ /studio/news/detail.php?ID=230354&PAGEN_2=11 [NC,L]
Код дозволяє створити копію сторінки з відносною адресою /studio/news/detail.php?ID=230354&PAGEN_2=11 на адресу /testovyi/test/
301-редирект з HTTPS-версії на HTTP
RewriteCond %{HTTPS} "on"
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,QSA]
Дозволяє усунути наявність дублів URL з HTTPS в індексі пошукових систем.
Перенесення сайту на версію з HTTPS (для всіх сторінок)
RewriteCond %{SERVER_PORT} ^80$ [OR] RewriteCond %{HTTP} =on RewriteRule ^(.*)$ https://domain.ua/$1 [R=301,L]
Налаштування 403 коду відповіді сервера для реф-спаму (301-редирект для спаму за REFERER) для списку ресурсів
RewriteCond %{HTTP_REFERER} ref-spam-site.ua [NC,OR]
RewriteCond %{HTTP_REFERER} another-ref-spam.ua [NC]
RewriteRule .* - [F]
Налаштування дозволяє відхилити спамний реферальний трафік із ряду ресурсів за заголовком HTTP_REFERER.Вказати шлях до файлу 404 помилки за допомогою .htaccess
Увага, важливо, щоб код відповіді сервера для 404 помилки був саме 404. Шлях до файлу вказується за допомогою наступного рядка:
ErrorDocument 404 /404-for-me.php
! Всі правила виконуються в прямому порядку їхнього прямування у файлі .htaccess і правило, написане пізніше, і буде виконуватися пізніше.
! Для сайтів, на яких використовується не сервер Apache, аналогічні 301-редиректи легко налаштовуються за допомогою PHP.
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.site.ua/dir/");
exit();
?>
! Оптимально налаштовувати всі редиректи відразу на кінцеву сторінку (без проміжних перенаправлень, в один крок) це покращує їхнє сприйняття з боку пошукових систем та користувачів.Якщо потрібно налаштувати редирект лише для деяких USER_AGENT’ів, а не для всіх користувачів
RewriteCond %{HTTP_USER_AGENT} (iPad|ipad|iphone|iPhone|ipod|iPod|android|midp|j2me|symbian|series\ 60|symbos|windows\ mobile|windows\ windows\phone) [NC] RewriteRule (.*) http://mobile.site.ua/ [L, R=301]
Якщо потрібно налаштувати редирект для всіх пошукових роботів (представлений список USER_AGENT’ів)
RewriteCond %{HTTP_USER_AGENT} ! (accoona|ia_archiver|antabot|ask\ jeeves|baidu|dcpbot |eltaindexer|feedfetcher|gamespy|gigabot|googlebot|gsa-crawler|grub-client|gulper|slurp|mihalism|msnbot|worldindexer jigsaw | webalta | yahoofeedseeker | yahoo! \ slurp | mmcrawler | yandexbot | yandeximages | yandexvideo | yandexmedia
| no-search.site.ua/ [L,R=301]
Декілька простих прикладів
Переадресація з www.site.ua/component/content/?view=featured на www.site.ua/
RewriteCond %{QUERY_STRING} ^view=featured$ [NC]
RewriteRule ^component/content/$ /? [R=301,L]
Переадресація з www.site.ua/index.php?idc=4&marea=6 на www.site.ua/
RewriteCond %{QUERY_STRING} ^idc=4&marea=6$ [NC]
RewriteRule ^index\.php$ /? [R=301,L]
Синтаксис для регулярних виразів
. — Крапка замінює довільний символ.
[abc] – позначає перелік символів, що збігаються з літерами a, b або с.
[^abc] — перелік символів, які не входять до вказаного діапазону. Збігається з будь-яким символом, окрім a, b, або с.
* – означає, що попередній символ може повторюватися (0 або більше разів).
[abc]* — команда знайде символи, що йдуть поспіль, із заданого набору.
[^abc]* — з точністю навпаки.
.* — замінює будь-який набір символів. “. *” – Знайде всі підрядки між лапками.
^ – Початок рядка (у тому випадку, якщо використовується на початку виразу).
$ – Позначає кінець рядка.
\w – буква, цифра або підкреслення _.
\d – замінює будь-яку цифру.
\D – замінює будь-який символ, але не цифру.
[0-9] – замінює будь-яку цифру.
[az] – будь-яка буква від a до z (весь латинський набір символів) у нижньому регістрі.
[AZ] – будь-яка буква від A до Z у верхньому регістрі.
[a-zA-Z] – будь-яка буква від a до Z у будь-якому регістрі.
[aZ] – те саме.
Забираємо всі GET-параметри після знака питання (?)
RewriteRule (.*) $1? [R=301,L]
Розташовувати після: RewriteBase /
ПАМ’ЯТКА ЗА СИМВОЛАМИ ТА ПОЗНАЧЕННЯМИ, ЩО ВИКОРИСТОВУЮТЬСЯ.
Рядок RewriteCond — умова виконання правила RewriteRule. Якщо умова виконується, спрацьовує редирект. Правила можуть задаватися за допомогою регулярних виразів.
Спецсимволи, що використовуються у правилах та їх значення.
- ^ – Спецсимвол початку рядка;
- $ – Спецсимвол кінця рядка;
- ! – Спецсимвол заперечення;
- . – Точка, замінює будь-який символ, але тільки один;
- () – Угруповання;
- \ — «екрануючий» слєш, наступний символ після нього вважається звичайним, а не спецсимволом;
- # — Початок текстового коментаря у файлі.
Модифікатори використовуються після звичайних спецсимволів або їх груп і дозволяють розширити можливості шаблонів для спрацьовування правил.
- ? символ повторюється 0 або 1 раз.
- + – Повторюється від 1 до 65536 разів.
- * – повторюється від 0 до 65 536 разів.
Прапори, задають дод. опції для використовуваного правила. Перераховуються в квадратних дужках через кому, скажімо [NC] або [R=301,L].
- NC — прапор NoCase, що вимикає перевірку регістру символів під час спрацьовування правила.
- R – прапор Redirect, здійснює процес зупинення зміни URL-адреси і повертає результат. Найчастіше використовується значення R=301, але можливі інші для тимчасових перенаправлень (302, MOVED TEMPORARY).
- L – прапор Last, зупиняє формування URL-адреси і рядок вважається остаточним.