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

Модераторы: Serafim, fatalist
  
> Хоть кто-нибудь использовал mod_rewrite? , ...help urgently needed!!!
    Сабж.... нифига не получается под виндой с перезаписью каталогов... :wall: :wall: :wall: :wall: :wall: :wall:
      Ну, мы что не люди? Конечно использовали. Вот пример моего .htaccess'a
      ExpandedWrap disabled
         
        RewriteEngine on
        Options +FollowSymlinks
        RewriteBase /
        RewriteRule ^(.*)today/([0-9])*/?$ $1today.php?film_id=$2
        RewriteRule ^(.*)soon/([0-9])*/?$ $1soon.php?film_id=$2
        RewriteRule ^(.*)archive/([0-9])*/?$ $1archive.php?film_id=$2
        RewriteRule ^(.*)cinema_news/[0-9]*/?$ $1cinema_news.php?
        RewriteRule ^(.*)performances/?$ $1performances.php?
        RewriteRule ^(.*)prices/?$ $1prices.php?
        RewriteRule ^(.*)discounts/?$ $1discounts.php?
        RewriteRule ^(.*)news/[0-9]*/?$ $1news.php?
        RewriteRule ^(.*)actions/[0-9]*/?$ $1actions.php?
        RewriteRule ^(.*)main/?$ $1index.php?
        Попробуй найти другое решение.
        Нет гарантии, что под windows что-то будет очень хорошо получаться.
          Сорри, совсем забыл. Работает пол XP, 2000, 98. Apache 1.3.*
          Какая конкретно проблема? А вообще Chainick'a сюда надо, он быстро со всем разберётся;))
            Нужна-то ерунда... чтоб её >:(

            Apache 2.0.48 - из адреса /site_dir/index.php/commands/a_b/c_d/index.html

            Сделать /site_dir/index.php?a=b&c=d

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


            Вот... битый день парюсь...
              ExpandedWrap disabled
                 
                RewriteRule ^(.*)index3.php/command/(.)*$ index2.php?$2


              и файл index2.php
              ExpandedWrap disabled
                 
                <?php
                $url = $_SERVER['REDIRECT_URL'];
                 
                $parts = explode('/', $url);
                 
                //это подредактируешь!
                unset($parts[0]);
                unset($parts[1]);
                unset($parts[2]);
                 
                array_values($parts);
                $commands = array();
                 
                foreach ($parts as $p) {
                list($c, $v) = split('_', $p, 2);
                $commands[] = array('command' => $c, 'value' => $v);
                }
                 
                print('<pre>');
                print_r($commands);
                print('</pre>');
                ?>


              На моей конфигурации работает!
                И еще попутно вопрос... вот ту последнюю часть надо просто отбросить....

                Можно ли написать так:

                RewriteRule /[^/]+$ /

                ???

                Не работает... лядская скотина >:( >:( >:(
                  Совсем забыл! это ВАЖНО! Нельзя, чтоб совпадали имена виртуаальных файлов с реальными, ибо он сначала обращаяется к реальным;) Поэтому юзаю index3.php и index2.php

                  Добавлено в :
                  Мы в одно и тоже время постим;) Что за беда-то;))

                  Добавлено в :
                  Над ещё добавить (перед всеми unset'ами):
                  ExpandedWrap disabled
                    unset($parts[count($parts) - 1]);
                  Сообщение отредактировано: Rom@nych -
                    Это не совсем то.... надо преобразовать ссылку в нормальную без PHP чтобы на PHP уже с ней не заморачиваться....
                      Мда-а... задача оказалась совсем не тривиальной <_< ...и все еще не решена
                        эээ... странно... все молчат...

                        А тогда такой вопрос: как запихать в один RewriteCond несколько RewriteRule'сов ?

                        Типа

                        ExpandedWrap disabled
                          if( RewriteCond() ) {
                            RewriteRule();
                            RewriteRule();
                              ...
                            RewriteRule();
                          }
                          Этот тред кто-нибудь читает? Или я один тут тусуюсь?

                          Мне точно известно :wacko: что многие пользуются этой фичей... тогда почему на самом продвиутом в Рунете :tong: форуме программеров никто не может мне помочь :'( :'( :'(

                          Ну хоть напишите, что не знаете... а то здесь тихо, как на кладбище.
                            Ты не один, нас много;) Таких как ты;)) А что такое RewriteCond() ? Я такого не видел... :ph34r:
                              rvt, извини, времени как всегда совсем не хватает :( Щас попробуем разобраться, потерпи часик, ок?
                                Цитата Rom@nych @ 13.08.04, 12:41
                                Ты не один, нас много;) Таких как ты;)) А что такое RewriteCond() ? Я такого не видел... :ph34r:

                                Это просто алгоритм.... не нужно все понимать буквально :)

                                Добавлено в :
                                Хотя... наверное нужно... просто я в запарке и объяснять подробно - некогда :( как смог
                                  Итак, вот что получилось за 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]


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


                                                Рейтинг@Mail.ru
                                                [ Script execution time: 0.0887 ]   [ 14 queries used ]   [ Generated: 3.07.26, 05:48 GMT ]