Digs - Персональная территория

Авторский проект Артема Глазкова
? 
        Версия для печати (цвет)  

Использование материалов
Заметка #11
30 августа 2005

Зацикливание (mod_rewrite)


    Был момент, когда я решил перейти на статику при помощи mod_rewrite. Освоил я это дело достаточно быстро, написал правила преобразования. Все отлично работало за исключением одного. У поисковых роботов (в частности Рамбера) есть привычка: придет, соберет кучу ссылок, а индексировать по этим ссылкам придет через месяц и даже больше. Поэтому паук Рамблера у меня до сих пор индексирует страницы по динамическим ссылкам. Вот я и подумал, а не перебросить ли мне его по 301-му редиректу на правильный адрес?
    Итак. Сначала было правило:

RewriteRule ^blog/rec/([0-9]+)$ /index.php?sec=blog&ss=viewrec&rcode=$1 [L]

    Дальше следовало написать обратное преобразование. При этом я почерпнул несколько новых знаний. Первое знание заключалось в том, что оказывается RewriteRule, занимается преобразованием URL без QUERY_STRING. Это значит, что обработка ведется только для той части, которая до знака “?”. Более того, по умолчанию все что после “?” потом добавляется к полученному адресу.
    Для анализа QUERY_STRING была использована директива RewriteCond. В итоге получено такое правило:

RewriteCond %{QUERY_STRING} ^sec=blog&ss=viewrec&rcode=([0-9]+)$
RewriteRule ^index.php$ /blog/rec/%1 [R=301]

    Переменная %1 это переменная, взятая из строки RewriteCond. Первая проблема этого правила состояла в том, что исходный QUERY_STRING добавлялся к результату правила. Избавление от него оказалось простым. Нужно в конце подстановки поставить знак “?”:

RewriteRule ^index.php$ /blog/rec/%1? [R=301]

    Теперь про зацикливание. После отработки этого правила, я надеялся, что после редиректа будет срабатывать правило преобразования статического адреса в динамический и все будет замечательно. Оказалось что показалось. На самом деле правило работало, но после него опять выполнялось правило преобразования в статику. В итоге получался бесконечный цикл преобразований. Я просмотрел всю документацию по опциям правил и не нашел ничего, чтобы избавиться от такой ситуации. А выход оказался совсем простым. Я просто в самом первом правиле поменял местами две переменные. Теперь это выглядит так:

RewriteRule ^blog/rec/([0-9]+)$ /index.php?ss=viewrec&sec=blog&rcode=$1 [L]

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


© 2005-16, Powered By Digs (Написать письмо, vk)