Эффективное правило для 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]Понравилась статья? Расскажите о ней друзьям: