Модуль rewrite сервера Apache предоставляет мощные возможности по перенаправленнию запросов. Это позволяет ещё до обработки запроса, к примеру, в коде программы на PHP вашего сайта, выполнить рутинные операции по изменению адреса страницы, параметров запроса и т.п.
В данной статье мы рассмотрим случаи, когда необходимо убрать параметры GET, или наоборот добавить/изменить.
Общие принципы
Если вы уже знаете, что такое mod_rewrite, как им пользоваться под apache, то пропускайте эту часть статьи.
Apache управляется конфигурационными файлами с именем .htaccess в директориях сервера и выполняет соответствующие инструкции. Главным из них является файл находящийся в корне сайта. В подкаталогах вашего сайта также могут находится .htaccess файлы, дополняющие/изменяющие директивы заданные в файлах ближе к корню.
Вот пример типичной переадресации в CMS средствами «мод рерайт»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Типичное перенаправлние всех запросов на скрипт /index.php # данные инструкции размещаются в корне сайта в файле .htaccess <IfModule mod_rewrite.c> #включаем использование модуля RewriteEngine On #устанавливаем базовый путь переадресации RewriteBase / #правила пишутся друг за другом и выполняются по порядку #1. Правило № 1 #если запрашивают файл index.php, то ничего не меняем (прочерк) #это позволяет избежать зацикливания RewriteRule ^index\.php$ - [L] #2. Правило № 2 #Эта переадресация сложнее, она предваряется условиями #если запрашивают не файл RewriteCond %{REQUEST_FILENAME} !-f #если запрашивают не каталог RewriteCond %{REQUEST_FILENAME} !-d #тогда выполняется перенаправление на скрипт index.php RewriteRule . /index.php [L] </IfModule> |
Этот базовый пример не сможет показать все разнообразие возможностей, посмотрите обязательно полное описание команд модуля Rewrite.
Есть отличие перенаправления от переадресации.
Перенаправление
Отличие заключается в том, что в первом случае происходит обработка запроса, так как будто он был выполнен к указанному в перенаправлении скрипту/файлу/адресу. В нашем случае мы направляем все запросы к index.php
Переадресация
При переадресации, а в этом случае я бы добавил специальный флаг [R]:
1 |
RewriteRule . /index.php [R=301,L] |
Сервер ответит клиенту, что нужно перейти по указанному адресу. Тогда клиент вновь запросит сервер, но уже по новому адресу. В адресной строке браузера, к примеру, отобразится этот новый адрес.
Теперь, когда вы имеете общие представления о работе модуля, то я покажу вам несколько примеров как с его помощью работать с параметрами GET .
Добавляем параметры GET к запросу в mod rewrite
Пример запроса:
http://mysite.ru/vazniy-razdel.html
нужно переадресовать на
http://mysite.ru/drugoy-razdel?param1=value
1 |
RewriteRule ^vazniy-razdel.html$ /drugoy-razdel?param1=value [R=301,L] |
Так мы добавили при переадресации нужный нам параметр GET param1.
Убрать любые GET параметры в запросе в mod rewrite
Пример запроса:
http://mysite.ru/vazniy-razdel.php?param1=value
нужно переадресовать на
http://mysite.ru/new-address.php
1 2 3 4 5 6 7 8 |
# обратите внимание, что условие - это регулярное выражение, # т.е. нужно экранировать спец символы в нем, если такие используются # а флаг [NC] - no case, означает, # что выражение не чувствительно к регистру RewriteCond %{QUERY_STRING} ^param1=value$ [NC] # тот факт, что GET параметры передавать не надо # указывается знаком ? без задания параметров RewriteRule ^vazniy-razdel\.php$ /new-address.php? [R=301,L] |
Так мы переадресуем только запрос, где есть param1=value. Если надо убрать параметры GET и выполнить редирект для любых вариантов запроса скрипта vazniy-razdel.php, то правило будет выглядеть вот так:
1 |
RewriteRule ^vazniy-razdel\.php$ /new-address.php? [R=301,L] |
Теперь любые запросы на /vazniy-razdel.php переадресуются в новый раздел, при этом параметры GET будут убраны.
Заменить имя GET параметра в запросе на другое в mod rewrite
Пример запроса:
http://mysite.ru/vazniy-razdel.php?param1=value
нужно переадресовать на
http://mysite.ru/new-address.php?prm=value
1 2 3 4 5 |
# нам нужно извлечь значение старого параметра, # чтобы потом его передать в RewriteRule RewriteCond %{QUERY_STRING} ^param1=(.*)$ [NC] # теперь значение value находится у нас в щаблоне %1 RewriteRule ^vazniy-razdel\.php$ /new-address.php?prm=%1 [R=301,L] |
Так мы заменили параметр param1 на prm.
Боты постоянно создают новые корзины с товаром, в резудьтате растет база.
Перепробовал много вариантов пернаправления запроса в .htaccess, но пока ничего не работает
Боты формируют запрос
jojoba.ru/cart.php?add=&id_product=15199&token=af735e7f7a28f4334932c558a86bafe3
где id_product=15199 и token=af735e7f7a28f4334932c558a86bafe3 меняются
то есть нужно перенаправлять запросы к
jojoba.ru/cart.php?add=&id_product= слюбым значением после id_product на /404.php
Что то вроде этого вам нужно?
RewriteCond %{QUERY_STRING} ^id_product=(.*)$ [NC]
RewriteRule ^cart\.php$ /404.php [R=301,L]
Как бы при этом нормальных покупателей на 404 не выпихнуть. Я бы просто корзины анонимов удалял через 1-2 часа после их неактивности.