Стоит следующая задача: выгнать пауков из папки /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 со следующим содержанием
- AddDefaultCharset UTF-8
- <IfModule mod_rewrite.c>
- RewriteEngine On
- RewriteBase /
- RewriteCond %{THE_REQUEST} GET\ /blog/?(id|m|stat|q)?/?([^&]+)
- RewriteRule ^blog/(id|m|stat|q)/([^/]+) /cgi-bin/python/ffcms/blog.py?$1=$2 [L]
- </IfModule>
- ErrorDocument 404 /index.shtml
Команда RewriteCond проверяет, стоит ли выполнять дальнейшее преобразование,а команда RewriteRule выполняет преобразование длинного реального урла в коротки виртуальный.
Теперь, после проверки рабочего состояния, можно заняться выживанием Веб пауков из вложенных в cgi-bin папок. Принцип выживания следующий: на любой запрос к вложенным в cgi-bin скриптам сообщать, что ресурс перемещён и давать новый, короткий урл. Для этого в папке cgi-bin (если она определенна как Script-alias) нужно создать файл .htaccess со следующим текстом:
- <IfModule mod_rewrite.c>
- RewriteEngine On
- RewriteBase /cgi-bin/
- RewriteCond %{THE_REQUEST} GET\ /cgi-bin/python/ffcms/blog.py\??(id|m)?=?([0-9]{1,4})?
- RewriteCond %{THE_REQUEST} GET\ /cgi-bin/python/ffcms/blog.py\?!(insert|edit)
- RewriteRule blog.py$ /blog/%1/%2? [R]
- </IfModule>
Здесь первая инструкция RewriteCond проверяет стоит ли перебрасывать на виртуальный урл, а вторая RewriteCond проверяет, не явлеяется ли запрос к админской части блог, которой всё равно на пауков, она исключает из перенаправления запросы содержашие за админские команды. RewriteRule - пребразует длиныый реальный урл в динамический и применяет к нему команду редиректа.
Чтобы было удобно отлаживать команды mod_rewrite нужно включить логирование:
- RewriteLog /tmp/rewrite.log
- RewriteLogLevel 9
Для любой команды RewriteRule следует использовать RewriteCond так как каждый запрос (картинки, стили, скрипты) будет проходить стадию преобразования.