Архив за Март, 2013

Переадресация (редирект) страниц с переменными

Если нужно сделать в .htaccess постоянную переадресацию со страницы с параметрами, передающимися после знака вопроса, на другую страницу (например, страниц, проиндексированных без ЧПУ, на страницы с ЧПУ), то обычный редирект работать не будет.
Вот обычный редирект:

Redirect 301 /folder/subfolder http://example.com/newfolder

Но если, к примеру, нам нужно переадресовать страницу вроде такой http://example.com/index.php?option=com_ex1&task=ex2&category_id=111&Itemid=222 на страницу http://example.com/newfolder, то придётся применять rewrite таким образом:

RewriteCond %{QUERY_STRING} ^option=com_ex1&task=ex2&category_id=111&Itemid=222$
RewriteRule ^index.php$ http://example.com/newfolder? [R=301,L]

Блокировка POST-запросов в .htaccess

С недавнего времени стали донимать боты-одиночки, которые непрерывно шлют POST-запросы на определённый URL, например:

111.111.111.111 - - [24/Mar/2013:11:28:01 +0300] "POST /edit HTTP/1.1" 404 13197 "http://example.com/" "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.14"

Лучше всего таких банить с помощью iptables, однако, если нет доступа к серверу, то с небольшим количеством ботов можно справиться и с помощью .htaccess:

RewriteCond %{REQUEST_URI} ^/edit$
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^ / [L,F]

В результате бот будет послан с ошибкой 403.
Здесь /edit — это страница сайта, к которой идут запросы.
Если боты ломятся на внутренние страницы, то мера будет такой:

RewriteCond %{REQUEST_METHOD} POST
RewriteRule .*/edit$ - [L,F]

Или универсальный метод, когда edit идёт и на главную, и на страницы:

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*/)?edit$ - [L,F]