На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Дополнения к правилам (только для данного раздела)
- Используйте подсветку синтаксиса при выделении исходного кода;
- В описании темы обязательно укажите язык программирования;
- Прежде чем задать вопрос, обязательно воспользуйтесь поиском и загляните в FAQ раздела.
- Если вопрос касается серверного ПО, указывайте ОС.
- Если вопрос касается ASP.NET то лучше будет задать его в соответствующем разделе. Там вы сможете получить ответ намного быстрее.

Модераторы: Serafim, fatalist
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Хоть кто-нибудь использовал mod_rewrite? , ...help urgently needed!!!
    Итак, вот что получилось за 10 минут работы:

    ExpandedWrap disabled
       
      #Apache 2.0.48 - из адреса /site_dir/index.php/commands/a_b/c_d/index.html
      #Сделать /site_dir/index.php?a=b&c=d
       
      RewriteEngine On
      RewriteRule ^index.php/([^/]+)/(.*([^\_]))/(.*([^\_]))/(.*)$ index.php?a=$3&c=$5


    Решение, может и корявое, но работает. Правда если я правильно понял, что ты хочешь.

    ЗЫ. Тема очень интересная, советую на будущее тебе почитать доку по регэкспам, и вот это: http://httpd.apache.org/docs/misc/rewriteguide.html.

    ЗЫЗЫ. У меня апач 1.3, но по-идее реврайты должны работать и под 2 версии, в общем не беднт работать - пиши :)
      Да, еще - никак не могу понять из-за чего такой гемор - где все это приходится использовать? :blink:
        Твой пример может и работает :) (я просто не проверял), но глядя на него у меня появляется вопрос к тебе, а если параметров типа /a_b/ буде не два, а двадцать? А если ты еще и их порядок не знаешь... вот в этом и проблема...
          rvt, тогда не вижу смысла парсить параметры на уровне веб-сервера.
          Не забывай, что rewrite_mod это не preg_replace(), поэтому предусмотреть замену незаданного заранее количества пар a_b довольно проблематично (хотя, в принципе, можно попробовать квантификаторы... хотя остается нерешенным вопрос о подставке параметров).

          Насчет порядка - по-моему нетрудно догадаться, что результатом rewrite-rule выражения (.*([^\_])) будет не только значение параметра b, но и а. Присмотрись повнимательнее.

          Кстати я мне не ясен твой сарказм - ты наверное не чего-то не понимаешь, но здесь никто не обязан заниматься твоей проблемой и предоставлять готовое решение.
          Мне, например, деньги платят немного за другое, хотя если бы такая проблема предстала передо мной, я бы, не сомневайся, нашел решение.
            Wow! Сразу извиняюсь, если кого-то обидел <_<

            Цитата
            Chainick, 13.08.04, 16:48
            Кстати я мне не ясен твой сарказм


            Мне никто ничего не должен... но ты же сам вызвался помочь... если прочитаешь внимательно весь тред, то увидишь, что я уже писал по поводу того, что параметров может быть разное количество и я не знаю его заранее.

            Цитата
            Chainick, 13.08.04, 16:48
            Насчет порядка - по-моему нетрудно догадаться, что результатом rewrite-rule выражения (.*([^\_])) будет не только значение параметра b, но и а. Присмотрись повнимательнее.


            Здесь мы друг друга не поняли. Объясню:

            У тебя в конце стоит "index.php?a=$3&c=$5". Т.е. в 3ем capture значение параметра "a", а в 5ом - параметра "b". Если они в исходной строке пойдут наоборот - это не сработает.

            Добавлено в :
            Проблема еще не решена, но всем огромное спасибо, кто пытался помочь :)
              Цитата
              rvt, 13.08.04, 16:20
              Здесь мы друг друга не поняли

              Почему же? Я тебя понял. Смотри пример:

              ExpandedWrap disabled
                 
                RewriteEngine On
                RewriteRule ^index.php/([^/]+)/(([^\_]).*([^\_]))/(([^\_]).*([^\_]).*)/(.*)$ index.php?$3=$4&$6=$7

              Это даст нам возможность не привязываться к именам переменных а и с. Это то, что ты имел ввиду?

              Цитата
              rvt, 13.08.04, 16:20
              параметров может быть разное количество и я не знаю его заранее

              Посмотри мой пост выше - я говорил, что с неизвестным количеством рараметров вылазят траблы: например как изменить символ "_" на "=" в регулярном выражении, после чего подставить его в виде передаваемой в скрипт переменной? Что-то мне подсказывает, что в данном контексте трудовые затраты себя не окупают, поэтому, повторюсь, парсинг легче решить средствами ПХП, напрмер организовав цикл.
              Кстати - насколько я знаю mod_rewrite циклы использовать не позволяет, там есть только последовательные переходы по цепочкам, но такое решение имхо тоже будет слишком громоздким.

              Кстати, а почему ты так критично высказываешься о способе Rom@nych-а? Он тебе чем-то не подходит?
                Цитата
                Chainick, 13.08.04, 17:41
                Это то, что ты имел ввиду?


                Да, но это, как ты сам и говоришь, частное решение... наверняка, если каким-от образом сделать все-таки цикличекую обработку, регексп будет выглядеть по-другому...

                Способ Rom@nych-а тоже вариант, но мне нужно именно через mod_rewrite only. Ну не может такая мощная вещь, как mod_rewrite, не давать возможности для решения в общем-то стандартной задачи... Пока нигде не видел такого решения, правда заниматься только поиском я понятное дело не могу, сейчас занимаюсь другой задачей. На выходных буду искать решение, уверен, должно быть. Если его нет, то сам хочу в этом убедиться :)

                На самом деле такое преобразование адресов, какое мне нужно - работает у нас на другой машине, но, странное дело, никто не знает, где лежат эти регекспы :blink: и я их тоже там не нашел :wacko: но чудес-то не бывает... там стоит Debian Linux
                  Похоже я понял в чем было дело. В том коде все делается на PHP без всякого mod_rewrite. Этот вариант работает на Linux, а на Windows - нет. И причина, кажется, в следующем:

                  Когда web-сервер идет за файлом, например, /a/b/index.php/c/d/e, Linux по ходу просматривает путь с начала до конца, т.е. как бы слева направо, наверное в каждый каталог заходит :tong: на предмет какой-нить инфы (типа как Apache за .htaccess, поскольку и тот и другой - OpenSource, GNU, C и т.д. предположу, что они и работают похожим образом :) только предположу, с *NIX'ами я знаком только в общих чертах). Короче, когда Linux находит index.php он его запускает, а остальную часть пути рассматривает, как параметры что ли... ну или никак не рассматривает, а из скрипта мы можем её обработать сами. А винда честно идет в каталог d за файлом e, которых естественно не существует.

                  Похоже на правду? :)

                  По поводу примера Rom@nych-а:
                  Цитата
                  Rom@nych, 12.08.04, 18:07
                  Нельзя, чтоб совпадали имена виртуаальных файлов с реальными, ибо он сначала обращаяется к реальным Поэтому юзаю index3.php и index2.php


                  По-моему, реальные файлы тут вообще ни при чем :) Возьмем тот же пример /a/b/index.php/c/d/e . Apache, по-видимому, считает, что ты "хочешь файл index.php из каталога /a/b/" . Если в процессе rewriting'а получится /a/b/index.php?c&d&e т.е. тот же файл, только с другой концовкой (как думает хитрый Apache ;) ), в логе тебе так и напишут:
                  ExpandedWrap disabled
                    initial URL equal rewritten URL: <здесь URL, о котором идет речь> [IGNORING REWRITE]


                  и так низзя, в чем я убедился на собственном опыте. Если кто-нить видел такое ограничение в мануале, ткните носом, дабы подтвердить свое мнение :)
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0512 ]   [ 15 queries used ]   [ Generated: 28.03.24, 23:24 GMT ]