За последние 24 часа нас посетили 27242 программиста и 1484 робота. Сейчас ищут 1013 программистов ...

RewriteRule с двумя перезаписями одного адреса URL

Тема в разделе "Регулярные выражения", создана пользователем Xavier Teodonius, 19 янв 2010.

  1. Xavier Teodonius

    Xavier Teodonius Активный пользователь

    С нами с:
    8 мар 2007
    Сообщения:
    65
    Симпатии:
    0
    Не один год работаю с регулярными выражениями, но с mod_rewrite сталкивался поскольку постольку.

    Задача: в 2 и более RewriteRule (которые будут выполняться подряд) сделать замены в запрошенном URL.

    Пример: пользователь запрашивает URL со строкой запроса "menu/category/category_id/26/"
    Требуется:
    1) через первый RewriteRule сделать замену "menu/category" на "?menu=category" так, что "/menu/category/category_id/26/" --> "?menu=category/category_id/26/",
    2) через второй RewriteRule (следующий и выполняющийся сразу за ним) сделать замену "/category_id/26/" на "&category_id=26" так, что "?menu=category&category_id=26".

    Первая замена происходит успешно, а вот для второй замены не могу составить правильное выражение. Помогите пожалуйста.

    З.Ы. В одну строку разобрать нельзя, т.к. пример я привел условный, в реальной работе таких пар "название"/"значение" будет много и их количество заранее неизвестно, так что 1 разбором обойтись нельзя.
     
  2. Xavier Teodonius

    Xavier Teodonius Активный пользователь

    С нами с:
    8 мар 2007
    Сообщения:
    65
    Симпатии:
    0
    Сам же и нашел решение (на случай, если кому-то пригодится):

    RewriteRule ^menu/([^/]*)(.*)$ ?menu=$1$2

    RewriteCond %{QUERY_STRING} ^([^/]*)/category_id/(\d*)$
    RewriteRule ^$ index.php?%1&category_id=%2
     
  3. STRELOK

    STRELOK Активный пользователь

    С нами с:
    4 янв 2010
    Сообщения:
    21
    Симпатии:
    0
    Лично мне удобно было бы перенаправлять все не существующие запросы (обращение к не существующим папкам и файлам) в скрипт, а потом в нем уже анализировать REQUEST_URI и "выносить приговор". По мне удобно, я так и сделал.
     
  4. Xavier Teodonius

    Xavier Teodonius Активный пользователь

    С нами с:
    8 мар 2007
    Сообщения:
    65
    Симпатии:
    0
    STRELOK
    А что можешь сказать по поводу производительности такого решения, если критична скорость выполнения? Мне кажется твое решение будет заметно медленнее.
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Xavier Teodonius
    Если ты никогда не делал профайлинг, то о производительности беспокоиться нет смысла.
     
  6. Xavier Teodonius

    Xavier Teodonius Активный пользователь

    С нами с:
    8 мар 2007
    Сообщения:
    65
    Симпатии:
    0
    Simpliest
    Можно узнать что это такое?
     
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
  8. STRELOK

    STRELOK Активный пользователь

    С нами с:
    4 янв 2010
    Сообщения:
    21
    Симпатии:
    0
    О производительности пока не задумывался, но пока все работает нормально, но в плане простоты скажем создания новых модулей - это более удобно.