При проектировании и тестировании веб-сайта иногда требуется выполнить временное автоматическое перенаправление с одной страницы на другую без потери его функциональности. Для этой цели применяются редиректы. Особенности их использования, правильная настройка и примеры приведены в этой статье.
Что такое редиректы
Редирект — это метод автоматического перенаправления посетителей с одной страницы на другую или на какой-либо сайт.
В каких случаях нужно использовать
- Похожие доменные адреса — редирект используется, чтобы перенаправить на нужный адрес пользователя, который ввел в строку браузера адрес сайта. Некоторые организации регистрируют ошибочные домены, указывая редирект на другой домен. Например, если указать адрес «googel.com», то произойдет перенаправление на правильный URL. Иногда компании резервируют несколько доменных имен, т. е. ссылки «site.com» и «site.org» перенаправляются на «site.ru».
- Переезд сайта на другой домен — применяется при расширении сайта, в результате которого требуется перенаправить трафик на другой домен. Причиной может быть расширение проекта, связанное с увеличением базы товаров или количеством регистраций пользователей, которые увеличивают нагрузку на сервер.
- Перенаправление на мобильную версию сайта — современные инструменты позволяют создавать приложения для мобильных устройств, популярность которых стремительно набирает обороты. Если зайти на страницу компании с планшетного ПК, то произойдет автоматическая переадресация на другой сайт мобильной версии.
- Хакерская атака — иногда веб-ресурсы подвергаются различным родам хакерских атак. Компании на них реагируют оперативно, устанавливая переадресацию на рабочий сайт.
- Изменение структуры интернет-ресурса — при необходимости замены существующей страницы на новую нужно установить редирект, чтобы избежать потери позиций и трафика.
- Использование доменных синонимов (алиасов) — применяют для перенаправления без «www» на сайт с «www», а также при использовании нескольких доменных зон (.ru, .com, org и т. д) или сокращения доменного имени.
Основные виды редиректов
Номера редиректов находятся в диапазоне от 1хх до 5хх, но на практике чаще применяются 3хх и 4хх. Первые (3хх) связаны с перенаправлением, а вторые (4xx) — с ошибками в браузере у пользователя.
Классификация 3хх редиректов
- 300 (множественный выбор) — редирект применяется, когда требуется предоставить пользователю несколько вариантов интернет-ресурса (например, в зависимости от географического положения — погода для конкретного региона).
При обращении пользователя, сервер предоставляет варианты выбора альтернативных источников (доменов или поддоменов). - 301 (перемещен окончательно) — запрошенный интернет-ресурс или документ окончательно перенесен на новый адрес, который указан в поле «Location» заголовка.
При этом новый веб-адрес заменяет старый с сохранением рейтинговых позиций (PageRank, PR) в поисковиках.PR — характеристика веб-ресурса или отдельной его страницы, показывающая ее приоритетность в поисковых системах (условный вес ссылки). Иными словами, страницы с высоким показателями PR занимают первые позиции в результатах поисковой выдачи. - 302 (перемещен на некоторое время) — временный перенос домена, поддомена или отдельной веб-страницы на другой адрес. Например, 302 редирект применяется для перенаправления пользователя на страницу с акционным товаром. В этом случае адрес не изменяется, поскольку прописывается временное перемещение интернет-ресурса.
- 303 (массовый переход) — ресурс запрашивается методом «GET», даже если запрос выполнялся другим способом (например, «POST»).
Примером является обыкновенное текстовое поле на сайте для перехода на другую страницу, и выполнение на ней процедуры поиска товара. Если указать в поле «Location» 303 редирект, то браузер делает POST-запрос с включением слова в поисковом поле. POST — метод, который передает информацию серверу, заключенную в сообщение (пользователь не может ее посмотреть). При обнаружении документа, соответствующего критериям поиска, происходит запрос последнего методом «GET». Последний позволяет передавать информацию серверу через адресную строку (пользователь видит все переменные и их значения). - 304 (не изменился через время) — применяется при работе с методом «GET». С его помощью пользователь запрашивает веб-ресурс, который не изменился с течением времени и его можно подгрузить из локального кэша.
- 305 (использовать прокси-сервер) — используется при получении информации с кодом 305. В этом случае браузер проверяет наличие в заголовке сообщения-запроса редиректа сведения о прокси-сервере. После этого происходит повторное обращение к указанному адресу через прокси-сервер.
- 306 (зарезервировано) — применяется при создании или расширении существующего проекта. Например, использование «заглушки» (страницы с сообщением, что сайт или раздел находится в разработке).
- 307 (перемещен на некоторое время) — запрашиваемый интернет-ресурс в течение определенного времени будет доступен по другому адресу. Редирект используется во время ведения технических работ на интернет-ресурсе для обеспечения бесперебойной работы сайта. Этот прием применяют практически все коммерческие площадки, а также фирмы для удержания клиентов.
- 308 (перемещен окончательно) — веб-ресурс будет постоянно находиться по указанному URL. Основным отличием 308 от 301 редиректа является невозможность изменения метода «POST» на «GET».
Для клиента все типы редиректов одинаковы, но браузеры и роботы поисковых систем идентифицируют их по коду состояния. Напрямую с перенаправлением связаны 5 видов редиректов (301, 302, 303, 307 и 308), которые используются для SEO-оптимизации сайта. Рассмотрим каждый из них подробно.
301-редирект
С точки зрения seo-оптимизации интернет ресурса редирект 301 является наиболее значимым, поскольку передает условный вес ссылки с небольшой потерей. Он кешируется по умолчанию поисковыми системами и позволяет избежать тупиковых переходов или объединения ссылок.
Когда используется
- Домен перемещается и находится на сервере на постоянной основе.
- Перемещение веб-страницы или отдельного документа, которые будут постоянно находиться в интернете.
- Окончательное изменение протокола интернет-ресурса.
- Загрузка на сервер уже готового проекта с измененной структурой.
Не рекомендуется применять
- Если кэширование приводит к некорректной работе веб-ресурса. Например, геотаргетинг (выдача при запросе пользователя информации, которая зависит от его географического положения), таргетинг устройств (показ рекламы непосредственно для устройства, с которого осуществляется выход в интернет), тестирование проекта на работоспособность, отслеживание действий и т. д.
- Временное перенаправление. Например, сезонные товары в интернет-магазинах, акционные предложения и т. д.
302 и 303
Редирект 302 рекомендуется использовать при временном перемещении интернет-ресурса на другой адрес (время должно указываться в настройках).
303-редирект используется так же как и 302, поскольку никогда не кэшируется. Его применяют при обозначении неопределенного времени размещения интернет-ресурса. Запрос к адресу выполняется посредством метода «GET».
Когда используется
- Геотаргетинг.
- Таргетинг на устройства.
- Тестирование проектов с функцией кэширования и без нее.
- Отслеживание действий пользователей.
- Постоянно меняющийся контент.
- Редирект на поддомен при отсутствии страницы с результатами поиска.
Не рекомендуется применять
- При передаче условного веса ссылки по конкретному адресу.
- Перемещение домена, сайта, документа на постоянной основе.
- Окончательное изменение протокола и структуры интернет-ресурса.
- Обработка формы посредством метода «POST».
307 и 308
Для замены 302-редиректа используется 307, когда поисковым системам требуется сообщить о сервере, который совместим с HTTP 1.1. Он делает постоянной величиной метод запроса, указанный в настройках, и не кэшируется по умолчанию. Отличие 308 редиректа от 307 состоит в том, что с его помощью можно обрабатывать POST-формы, не изменяя метод переадресации.
Когда используется
- Повторный запрос отправки формы методом «POST».
- Метод запроса, который должен оставаться постоянным.
- Навигация на сайте с большим количеством POST-форм.
- Перемещение домена, сайта и документа на постоянной основе.
- Окончательное изменение протокола и структуры интернет-ресурса.
- Обработка формы посредством метода «POST».
Не рекомендуется применять
- Если интернет-ресурс перемещен на постоянной основе.
- При передаче важности ссылки.
Классификация 4хх редиректов
- 400 (неверный запрос) — в запросе пользователя обнаружена синтаксическая ошибка, возникающая при неверном написании кода.
- 401 (пользователь не авторизован) — для перехода на ресурс требуется авторизация пользователя.
- 402 (недостаток денежных средств) — предусмотрен для платных пользовательских сервисов.
- 403 (в доступе отказано) — ограничение, при котором сервер получил запрос пользователя, но не загружает указанную страницу, поскольку у него нет соответствующих прав доступа. 403 редирект происходит при попытке зайти обыкновенного пользователя в административную панель или стоит ограничение администратора к доступу сайта.
- 404 (не найдена) — возникает при ошибочном написании URL-адреса страницы, а также 404 редирект указывает на отсутствие интернет-ресурса на сервере.
Методы реализации перенаправлений
- Файл .htaccess — файл настроек Apache сервера, применяемый при настройке различных параметров сайта, в том числе и переадресации.
- PHP — скриптовый язык, позволяющий указывать параметры редиректов посредством PHP-кода.
- HTML — прописывается в теле веб-документа. При открытии страницы с редиректом посредством браузера происходит чтение заголовка «header» и выполнение всех условий. При этом весь контент, находящийся ниже редиректа, не отображается в окне браузера.
- JavaScript — управление механизмом перенаправления при помощи js-скриптов.
Первый тип наиболее удобен и часто используется для настройки переадресации, поэтому разберем его подробнее.
Настройка редиректа в .htaccess файле
Редирект через .htaccess приобрел широкую популярность, поскольку не требует знаний HTML, PHP и JavaScript. Для изменения файла .htaccess можно его скачать или отредактировать на сервере при помощи FTP-клиента.
Алгоритм установки FTP-клиента FileZilla
-
- Открываем терминал Ubuntu при помощи сочетания клавиш — Ctrl+Alt+T.
- Вводим команду
sudo apt-get install filezilla
- Запуск FTP-клиента.
- Ввод параметров соединения, которые предоставлены ранее хостером.
- Нажимаем кнопку «Быстрое соединение».
- После этих действий отобразятся две панели, как в файловом менеджере. В левой — файловая система компьютера, с которого выполнено подключение, а в правой — файлы и папки сервера.
- Если .htaccess, посредством которого осуществляется настройка редиректа, не отобразился, то следует зайти в меню программы и выбрать пункты «Сервер» → «Принудительно отображать скрытые файлы».
- Затем необходимо скачать файл на локальный компьютер и открыть его в блокноте.
- Для загрузки файла на компьютер требуется выбрать файл в FTP-клиенте и загрузить, используя правую кнопку мыши или обыкновенное перетаскивание.
Что такое mod_rewrite
Чтобы прописать редирект в файле конфигурации сервера Apache, нужно придерживаться некоторых правил.
Модуль mod_rewrite применяется на веб-серверах Apache для изменения URL-адресов. Для работы модуль использует набор директив, прописанных в основном конфигурационном файле Apache (httpd.conf) либо в файле .htaccess. Основными директивами модуля являются RewriteCond и RewriteRule. Правила для mod_rewrite должны соответствовать синтаксису регулярных выражений.
Директива RewriteCond
Определяет условия при которых происходят преобразования модуля mod_rewrite на Apache сервере.
Директива RewriteRule
Задает правила благодаря которым происходят эти преобразования.
Расположение правил
Все директивы нужно прописывать после двух строк:
Options +FollowSymLinks RewriteEngine On
Директива RewriteRule обязательно должна идти после директивы RewriteCond.
Синтаксис .htaccess
Регулярные выражения
- буква, цифра или подчёркивание (_) — \w;
- заменяет любую цифру — \d;
- заменяет любой символ, но не цифру — \D;
- заменяет любую цифру — [0-9];
- любая буква от a до z (весь латинский набор символов) в нижнем регистре — [a-z];
- любая буква от A до Z в ВЕРХНЕМ регистре — [A-Z];
- любая буква от a до Z в любом регистре — [a-zA-Z].
Специальные символы
- начало строки — ^;
- конец строки — $;
- отрицание — !;
- замена любого символа — .;
- группировка — ();
- экранирование — \.
Флаги
Указываются в квадратных скобках — [].
- отключение проверки регистра — NC;
- указание типа редиректа — R=3xx;
- конец строки — L.
Модификаторы повторения символов для шаблонов
- 0 или 1 раз — ?;
- 1 и более раз — +;
- 0 или более раз — *.
Комментарий
Не обрабатывается и обозначается символом «#» в начале строки
#пример комментария
Ниже приведен пример файла .htaccess, запрещающего доступ ко всем файлам проекта на сервере.
Примеры редиректов
Для использования конкретного редиректа достаточно поменять символы «3хх» на требуемые значения (от 301 до 308) с учетом его характеристик.
Простой 301-й редирект с одной страницы на другую
Redirect 301 /category/old.html http://www.site.ru/category/new.html
В этом случае ссылку на новую страницу нужно прописывать полностью с протоколом http или https.
Другой вариант редиректа с директивой RewriteRule
RewriteRule ^old /new/$1 [L,R=301]
Редирект без изменения URL
Чтобы сделать редирект без изменения url, нужно не указывать тип редиректа «R». В результате по адресу http://site.ru/category/post будет открываться страница page.html, а в адресной строке браузера останется /category/post
RewriteRule ^category/post.* /page.html [L]
Убрать www в начале домена можно двумя способами.
Первый способ с указанием домена:
RewriteCond %{HTTP_HOST} ^www.site\.ru$ [NC] RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
Второй способ без указания доменного имени:
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=3хх,L]
Добавить www в начало домена можно также двумя способами.
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]
Альтернативный вариант:
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC] RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
Редирект с http на https
Для перенаправления всех страниц с портокола http на https есть несколько способов.
Первый способ:
RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
В случае если не сработал первый способ попробуйте другой.
RewriteCond %{HTTPS} =off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]
Если оба способа не работают и происходит циклическая переадресация добавьте в условие X-Forwarded-Proto.
RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Ещё один вариант редиректа c http на https.
RewriteCond %{ENV:HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Редирект с https на http
Бывает необходимо сделать обратное перенаправление с https на http. Сделать это можно слудующим образом:
RewriteCond %{SERVER_PORT} ^443$ [OR] RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
Перенаправление с index.php, index.html и index.htm на главную страницу
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/ RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=3хх,L]
Убрать index.php в URL для всех страниц сайта
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?/$1 [L]
Перенаправление на index.php
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ /index.php [L,QSA]
Редирект всех страниц на главную (для всех внутренних страниц сайта)
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /? [L,R=301]
Редирект на другой сайт или склейка домена
RewriteCond %{HTTP_HOST} ^oldsite\.ru RewriteRule ^(.*)$ http://newsite.ru/$1 [R=301,L]
Добавить слэш в конце URL
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !\..{1,10}$ RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://www.site.ru/$1/ [L,R=301]
Убрать слэш в конце URL
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^(.+)/$ RewriteRule ^(.+)/$ http://www.site.ru/$1 [R=301,L]
В настоящее время пользуются популярностью адаптивные сайты, которые правильно отображаются в зависимости от разрешения экрана устройства. Если все же нужно сделать перенаправление на мобильную версию сайта то сделать это можно с указанием конкретных user agent. Для примера возьмем самые популярные, которые можно заменить или добавить другие.
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos" [NC] RewriteRule ^$ http://m.site.ru/ [L,R=302]
Если нужно чтобы в браузере на ПК по ссылке m.site.ru открывалась обычная версия сайта, то нужно поставить знак «!» в предыдущем примере.
RewriteCond %{HTTP_USER_AGENT} "!(android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos)" [NC] RewriteRule ^$ http://www.site.ru/ [L,R=302]
Редирект на 404 страницу (обработка 404-й ошибки):
При проектировании сайта обязательно требуется настроить 404-ошибку в .htaccess, подставив вместо стандартного сообщения в браузере созданную заранее для этого страницу.
ErrorDocument 404 /error.html
Редирект с основного домена на поддомен
RewriteCond %{HTTP_HOST} ^(www.)?site\.ru$ [NC] RewriteRule ^(.*)$ http://subdomain.site.ru/ [L,R=302]
Редирект с IP на домен
RewriteCond %{HTTP_HOST} ^www\.site\.ru [OR] RewriteCond %{HTTP_HOST} ^123\.123\.123\.123 RewriteRule (.*) https://site.ru/$1 [R=301,L]
123.123.123.123 нужно заменить на IP-адрес сервера.
Редирект с кириллического URL
Домены на кириллице российской национальной зоны «.рф» и кириллические ссылки подчиняются тем же правилам редиректа, как и все остальные. Но, чтобы избежать ошибок при создании перенаправления, кириллические символы (Unicode) следует преобразовать в латинские (ASCII) методом Punycode.
Конвертация осуществляется автоматически с помощью специализированных онлайн-сервисов, например, таких как Charset или Cryptii. Полученное в итоге алфавитно-числовое значение следует вставить в описанные шаблоны использования редиректов, вместо имени кириллического домена или ссылки.