Пример использования mod_rewrite

Стоит следующая задача: выгнать пауков из папки /cgi-bin/ при этом не нарушив работу сайта

имеем следующие урлы:

http://rekoweb.ru/cgi-bin/python/ffcms/blog.py

http://rekoweb.ru/cgi-bin/python/ffcms/blog.py?id=65

http://rekoweb.ru/cgi-bin/python/ffcms/blog.py?m=8

http://rekoweb.ru/cgi-bin/python/ffcms/blog.py?stat=hour

http://rekoweb.ru/cgi-bin/python/ffcms/blog.py?q=ArchLinux

http://rekoweb.ru/cgi-bin/python/ffcms/blog.py?insert=100

http://rekoweb.ru/cgi-bin/python/ffcms/blog.py?edit=100

Первым делом необходимо создать виртуальный путь. в моём случае он будет выглядеть вот так

http://rekoweb.ru/blog

http://rekoweb.ru/blog/id/65

http://rekoweb.ru/blog/m/8

Для этого в корне сайта rekoweb.ru/www нужно создать файл .htaccess со следующим содержанием

  1. AddDefaultCharset UTF-8
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteBase    /
  5. RewriteCond %{THE_REQUEST} GET\ /blog/?(id|m|stat|q)?/?([^&]+)
  6. RewriteRule ^blog/(id|m|stat|q)/([^/]+) /cgi-bin/python/ffcms/blog.py?$1=$2 [L]
  7. </IfModule>
  8. ErrorDocument 404 /index.shtml

Команда RewriteCond проверяет, стоит ли выполнять дальнейшее преобразование,а команда RewriteRule выполняет преобразование длинного реального урла в коротки виртуальный.

Теперь, после проверки рабочего состояния, можно заняться выживанием Веб пауков из вложенных в cgi-bin папок. Принцип выживания следующий: на любой запрос к вложенным в cgi-bin скриптам сообщать, что ресурс перемещён и давать новый, короткий урл. Для этого в папке cgi-bin (если она определенна как Script-alias) нужно создать файл .htaccess со следующим текстом:

  1. <IfModule mod_rewrite.c>
  2. RewriteEngine On
  3. RewriteBase /cgi-bin/
  4. RewriteCond %{THE_REQUEST}    GET\ /cgi-bin/python/ffcms/blog.py\??(id|m)?=?([0-9]{1,4})?
  5. RewriteCond %{THE_REQUEST}    GET\ /cgi-bin/python/ffcms/blog.py\?!(insert|edit)
  6. RewriteRule blog.py$ /blog/%1/%2?        [R]
  7. </IfModule>

Здесь первая инструкция RewriteCond проверяет стоит ли перебрасывать на виртуальный урл, а вторая RewriteCond проверяет, не явлеяется ли запрос к админской части блог, которой всё равно на пауков, она исключает из перенаправления запросы содержашие за админские команды. RewriteRule - пребразует длиныый реальный урл в динамический и применяет к нему команду редиректа.

Чтобы было удобно отлаживать команды mod_rewrite нужно включить логирование:

  1. RewriteLog  /tmp/rewrite.log
  2. RewriteLogLevel 9

Для любой команды RewriteRule следует использовать RewriteCond так как каждый запрос (картинки, стили, скрипты) будет проходить стадию преобразования.


Другие примеры mod_rewrite

Комментариев 0
Нужна авторизация с помощью
Об авторе
Илья Илья

меня можно найти тут