Простой редирект через .htaccess
Разберём одну из самых популярных задачу, которую возлагают на файл ".htaccess" - это переадресация посетителя сайта на другую страницу. Откройте файл .htaccess в корневом каталоге сайта и в самом начале, первой строчкой напишите:Redirect 301 / https://mousedc.ru
301 означает, что во время перенаправления пользователя сервер выдаст код ответа 301-"Permanent Redirect", что означает, что документ перенесён на новый навсегда.
Некоторые возможные HTTP статусы:
301 - документ перемещен постоянно
302 - документ перемещен временно
303 - смотрите другой документ
403 - документ запрещён к просмотру
404 - документ не найден
410 - документ убран
Слеш "/" после 301 означает, что перенаправление будет срабатывать в любом случае, к какой бы странице или файлу не обратился пользователя. Если вместо слеша поставить адрес файла, к примеру:
301 - документ перемещен постоянно
302 - документ перемещен временно
303 - смотрите другой документ
403 - документ запрещён к просмотру
404 - документ не найден
410 - документ убран
Redirect 301 /folder/page1.php https://mousedc.ru
- то будет происходить переадресация только в том случае, если пользователь запросит страницу "/folder/page1.php".
Последним параметром для Redirect стоит адрес страницы, на которую будет сделано перенаправление. В примере это "https://mousedc.ru".
Редирект с регулярным выражением через .htaccess
Существует возможность сделать редирект по регулярному выражению. То есть в случае, если запрашиваемый адрес подходит под регулярное выражение, то будет происходить редирект:RedirectMatch 301 (.*) https://mousedc.ru$1
Чтобы понять, что происходит в этом коде, рекомендуем прочитать все статьи о регулярных выражениях, начиная с Регулярные выражения в PHP. Если кратко, то образуется карман (.*), значение которого подставляется в самый конец домена, вместо $1 в строке https://mousedc.ru$. В кармане находится относительный адрес запрашиваемой страницы (то есть без домена).
Использование регулярного выражения полезно для переадресации обращения к файлам. К примеру, сделаем переадресацию при запросе jpg картинок:
RedirectMatch 301 (.*\.jpg)$ https://mousedc.ru/example.jpg
Изменение адресов и Mod_rewrite
Mod_rewrite - модуль, используемый Apache для преобразования адресов. Во время преобразования адресов происходит обращение к одному файлу, запрашиваемому по другому адресу. Этот приём часто используется в реальных проектах сайтов. Рассмотрим простейший пример изменения адреса сmousedc.ru/product/5/
на mousedc.ru/product/index.php?id=5
. Такое преобразование можно часто встретить :
RewriteEngine on
RewriteRule ^product/([0-9]+)/?$ product/index.php?id=$1 [L]
При таком правиле пользователь будет заходить на страницу mousedc.ru/product/5/
, а сервер будет возвращать содержание страницы mousedc.ru/product/index.php?id=5
.
В конце правила можно заметить квадратные скобки. В эти скобки [ ] ставятся флаги. Можно поставить один флаг, к примеру, [L] и несколько флагов через запятую [NC,R=301,L]. Приведём значения самых популярных из них:
- R - вызывает редирект. Можно казать после этого флага код ответа сервера, например [R=301]
- L - останавливает процесс изменения адреса. Означает, что следующие RewriteRule после этой строчки не будут выполнены
- N - перезапускает преобразование адреса заново, начиная с первого правила. Но на этот раз подставляется адрес, изменённый в процессе проделанных преобразований. Будте осторожны, чтобы не сделать бесконечный цикл
- C - если следующее после этого правило не выполняется, то преобразование будет прервано. Если выполняется, то преобразование продолжится
- NC - делает шаблон преобразования нечувствительным к регистру. То есть могут быть переданы азглавные и строчные символы - всё будет обработано правилом
- NE - не даёт преобразовывать спецсимволы в шестандцатиричные кодировки. К примеру, не даёт заменять в адресе символ "$" на "%24".
- F - делает документ запрещённым - вызывает HTTP со статусом 403
- G - указывает на несуществующий документ - вызывает HTTP со статусом 410
/products/
на один адрес. В этом нам поможет следующее правило:
RewriteRule ^products/(.*)$ /products.php [L,R=301]
- такое правило может пригодиться, если нужно закрыть давно существующий раздел, но не хочется терять ссылочную массу.