Эффективное правило для mod_rewite

версия для печати

Пишу .htaccess для своего движка. В очередной раз скопипастил классическое:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,QSA]
И только тут задумался над тем, что же реально происходит при таком правиле...

А происходит вот что: проверка на отсутствие любого запрошенного файла/каталога и перенаправление запроса в index.php, и это - долго. Так же не запрещено прямое обращение к скриптам. Оказалось, не один я такой, кому классика не улыбает. Не смотря на то, что в статье решение ошибочное (REQUEST_FILENAME даст полный путь от корня, а не просто файл), в комментариях все же присутствует истина :) Мое правило:

RewriteEngine On
RewriteBase /
# Если запрос не совпадает с перечисленным - отправлять его в index.php
RewriteCond %{REQUEST_URI} !^/(index\.php|images|files|view/assets|robots\.txt|sitemap\.xml)
RewriteRule .* index.php [L,QSA]

Это быстрее, чем классическая проверка "не файл|не каталог". К тому же запретит прямое обращение к скриптам. Не забудьте перенести favicon.ico в [images/] или добавить его в условие.

Так же рекомендую в каталогах статики добавить запрет на выполнение скриптов через apache:

php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp

Будет работать, пока хакеры не перепищут этот файл :)

[1oo%, EoF]

Понравилась статья? Расскажите о ней друзьям:


Комментарии

Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Для работы модуля комментариев включите javaScript

Продвижение
Время
Метки