htaccess — идеальный и безопасный инструмент для организации редиректа страниц внутри сайта.
Для чего нужен файл .htaccess?
.htaccess — это специальный файл веб-сервера Apache, в котором записаны инструкции для управления поведением сервера в этой папке, и во всех вложенных (если в них отсутствуют свои файлы .htaccess).
Данный файл является идеальным и безопасным инструментом для организации редиректа — т.е. перенаправления с одних страниц на другие страницы сайта.
Настройка переадресации актуальна при разработке сайта или доработке сайта. Обычно потребность возникает в следующих случаях:
- Необходимость добавления «www» в URL, чтобы объединить сайт с «www» и без «www».
- Потребность работы сайта по защищенному протоколу HTTPS с SSL-сертификатом шифрования — настраивается редирект с протокола «http://» на протокол «https://». Это обязательно для работы платежных систем, а также для более активного роста сайта в поиске.
- Направление на корректные страницы сайта при удалении старых. При удалении обычно перенаправляют на главную страницу или на страницу со схожим контентом.
- При изменении адреса страниц перенаправляют на новый адрес аналогичной страницы.
- Если к сайту подключено несколько доменов и чтобы поисковые системы их не считали разными, то также настраивается редирект на один основной домен. Например, с доменов в зонах .com и .рф, на домен в зоне .ru.
- Для корректного формирования адресов страниц, например, чтобы все страницы были с закрывающим слэшем «/».
Все вышеперечисленные пункты очень важны для seo продвижения сайта. Поисковые системы, впрочем, как и посетители сайта, не должны видеть 404 ошибку об отсутствии страницы и всегда должны попадать на актуальную и корректную страницу из поиска.
Это обязательно положительно повлияет на уменьшение количество отказов сайта, повышение продолжительности посещения и конечно же на увеличение количества посетителей в конечном счете.
Способы осуществления редиректа через файл .htaccess
Для осуществления на сайте редиректа через файл .htaccess, можно использовать любую из трех директив Apache:
- Redirect;
- RedirectMatch;
- RewriteRule.
Правила использования директивы Redirect
Redirect [status] URL-path URL-to-redirect
status — это статус кода состояния HTTP (вид перенаправления) в виде трех цифр. Первая цифра указывает на класс состояния: 3xx — Redirection (перенаправление).
Примеры статусов кода состояния HTTP класса Redirection (перенаправления):
- 300 Multiple Choices - Множество выборов;
- 301 Moved Permanently - Перемещено навсегда;
- 302 Moved Temporarily - Перемещено временно;
- 303 See Other - Смотреть другое;
- 304 Not Modified - Не изменялось;
- 305 Use Proxy - Использовать прокси;
- 306 Зарезервировано - код использовался только в ранних спецификациях;
- 307 Temporary Redirect - временное перенаправление.
Наиболее часто используются коды 301 и 302 перемещение навсегда или перемещение временно.
URL-path — часть запрашиваемого пользователем или поисковой системой адреса, которая должна обязательно начинаться со слэша «/».
- Если URL-path заканчивается не слэшем, то редирект будет срабатывать только в случае точного совпадения запрошенного пользователем адреса и URL-path.
- Если URL-path заканчивается слэшем, то редирект сработает не только для указанного адреса, но и для всех, которые начинаются на указанный адрес. А к URL-to-redirect будет добавлена часть адреса, следующая за последним указанным слэшем в URL-path.
URL-to-redirect — полный адрес сайта, конкретной страницы или раздела, на который будет осуществляться перенаправление. При этом должен присутствовать протокол (http:// или https://) и закрывающий адрес сайта знак «/».
Правила использования директивы RedirectMatch
RedirectMatch [status] URL-regexp URL-to-redirect
Действие директивы RedirectMatch аналогично Redirect. Отличие заключается в том, что в параметрах URL-regexp и URL-to-redirect можно использовать регулярные выражения.
Специальные символы используемые в регулярных выражениях
- Точка «.» — подразумевается наличие любого символа.
- Круглые скобки «()» — все, что в них находится в первом выражении, записывается в специальные переменные $1, $2, $3, и т. д. подряд, в порядке встречи скобок. Далее переменные можно использовать во втором выражении.
- Квадратные скобки «[]» — все, что в них находится, это так называемый список перечисления. Например: запись [0–9] — означает наличие одной цифры, [a-z] — любую маленькую латинскую букву, а [A-Za-z_-] — любую латинскую букву, знак подчеркивания или прочерк.
- Вопросительный знак «?» — означает, что символ перед ним или выражение, если оно заключено в круглые или квадратные скобки, может присутствовать, а может и не присутствовать. А если вместо вопросительного знака «?» поставить знак звездочка «*», то символ или выражение в скобках может присутствовать несколько раз, а может и не присутствовать вовсе.
- Знак степени «^» — означает начало строки, а знак доллар «$» — ее конец.
- Обратный слэш «\» — если необходимо, чтобы какой-либо специальный символ был применен по его прямому назначению (то есть, чтобы точка стала точкой, а не любым символом), то перед этим символом ставится этот специальный символ «\» . И, соответственно, чтобы обратный слэш им и остался, перед ним так же необходимо поставить этот спецсимвол.
Правила использования директивы RewriteRule
RewriteEngine on #Должно быть включено для работы RewriteRule
RewriteRule URL-regexp URL-to-redirect [L,R[=status]]
У директивы RewriteRule более широкий спектр применения, который, в числе прочих возможностей, разрешает ее использование для перенаправления флагов L (выполнить немедленно) и R (редирект). Флаги L и R указываются в конце строки в квадратных скобках «[]».
Правила использования директивы RewriteRule вместе с RewriteCond
RewriteEngine on
RewriteCond %{NAME_OF_VARIABLE} URL
RewriteRule URL-regexp URL-to-redirect [L,R[=status]]
Директива RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директив RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URLсоответствует условиям этой директивы и также условиям этих дополнительных директив.
Переменные сервера %{NAME_OF_VARIABLE} — переменные полностью соответствуют названным похожим образом MIME-заголовкам HTTP.
Пример редиректа в файле .htaccess
Внимание! Перед вставкой скопированного кода в файл .htaccess, отредактируйте его в блокноте или другой программе.
Пример редиректов для склейки зеркал в файле .htaccess:
# Редирект с http на https
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Редирект с http на https, кроме файлов обмена 1С: 1c_exchange.php
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} !^(.*)1c_exchange(.*)$ [NC] [OR]
RewriteCond %{QUERY_STRING} !^(.*)1c_exchange(.*)$ [NC]
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Редирект с www на без www (c https)
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# Редирект с без www на с www (c https)
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
# Редирект с без закрывающего «/» на с закрывающим «/»
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]
# Редирект нескольких «//» на конце на один «/»
RewriteCond %{THE_REQUEST} //
RewriteCond %{QUERY_STRING} !http(s|)://
RewriteRule .* /$0 [R=301,L]
# Редирект c исключением index.php, если он есть в конце URL
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
RewriteRule ^(.*)$ %1/ [R=301,L]
# Редиректы разделов и страниц
RedirectMatch 301 ^/old_section_and_all_pages/(.*) /new_section/
RedirectMatch 301 ^/old_section_and_all_pages/(.*) /new_section_and_all_pages/$1
RedirectMatch 301 ^/old_section/ /new_section/