Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.227.239.9] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Итак, вот что получилось за 10 минут работы:
#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 версии, в общем не беднт работать - пиши |
Сообщ.
#17
,
|
|
|
Да, еще - никак не могу понять из-за чего такой гемор - где все это приходится использовать?
|
Сообщ.
#18
,
|
|
|
Твой пример может и работает (я просто не проверял), но глядя на него у меня появляется вопрос к тебе, а если параметров типа /a_b/ буде не два, а двадцать? А если ты еще и их порядок не знаешь... вот в этом и проблема...
|
Сообщ.
#19
,
|
|
|
rvt, тогда не вижу смысла парсить параметры на уровне веб-сервера.
Не забывай, что rewrite_mod это не preg_replace(), поэтому предусмотреть замену незаданного заранее количества пар a_b довольно проблематично (хотя, в принципе, можно попробовать квантификаторы... хотя остается нерешенным вопрос о подставке параметров). Насчет порядка - по-моему нетрудно догадаться, что результатом rewrite-rule выражения (.*([^\_])) будет не только значение параметра b, но и а. Присмотрись повнимательнее. Кстати я мне не ясен твой сарказм - ты наверное не чего-то не понимаешь, но здесь никто не обязан заниматься твоей проблемой и предоставлять готовое решение. Мне, например, деньги платят немного за другое, хотя если бы такая проблема предстала передо мной, я бы, не сомневайся, нашел решение. |
Сообщ.
#20
,
|
|
|
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". Если они в исходной строке пойдут наоборот - это не сработает. Добавлено в : Проблема еще не решена, но всем огромное спасибо, кто пытался помочь |
Сообщ.
#21
,
|
|
|
Цитата rvt, 13.08.04, 16:20 Здесь мы друг друга не поняли Почему же? Я тебя понял. Смотри пример: RewriteEngine On RewriteRule ^index.php/([^/]+)/(([^\_]).*([^\_]))/(([^\_]).*([^\_]).*)/(.*)$ index.php?$3=$4&$6=$7 Это даст нам возможность не привязываться к именам переменных а и с. Это то, что ты имел ввиду? Цитата rvt, 13.08.04, 16:20 параметров может быть разное количество и я не знаю его заранее Посмотри мой пост выше - я говорил, что с неизвестным количеством рараметров вылазят траблы: например как изменить символ "_" на "=" в регулярном выражении, после чего подставить его в виде передаваемой в скрипт переменной? Что-то мне подсказывает, что в данном контексте трудовые затраты себя не окупают, поэтому, повторюсь, парсинг легче решить средствами ПХП, напрмер организовав цикл. Кстати - насколько я знаю mod_rewrite циклы использовать не позволяет, там есть только последовательные переходы по цепочкам, но такое решение имхо тоже будет слишком громоздким. Кстати, а почему ты так критично высказываешься о способе Rom@nych-а? Он тебе чем-то не подходит? |
Сообщ.
#22
,
|
|
|
Цитата Chainick, 13.08.04, 17:41 Это то, что ты имел ввиду? Да, но это, как ты сам и говоришь, частное решение... наверняка, если каким-от образом сделать все-таки цикличекую обработку, регексп будет выглядеть по-другому... Способ Rom@nych-а тоже вариант, но мне нужно именно через mod_rewrite only. Ну не может такая мощная вещь, как mod_rewrite, не давать возможности для решения в общем-то стандартной задачи... Пока нигде не видел такого решения, правда заниматься только поиском я понятное дело не могу, сейчас занимаюсь другой задачей. На выходных буду искать решение, уверен, должно быть. Если его нет, то сам хочу в этом убедиться На самом деле такое преобразование адресов, какое мне нужно - работает у нас на другой машине, но, странное дело, никто не знает, где лежат эти регекспы и я их тоже там не нашел но чудес-то не бывает... там стоит Debian Linux |
Сообщ.
#23
,
|
|
|
Похоже я понял в чем было дело. В том коде все делается на PHP без всякого mod_rewrite. Этот вариант работает на Linux, а на Windows - нет. И причина, кажется, в следующем:
Когда web-сервер идет за файлом, например, /a/b/index.php/c/d/e, Linux по ходу просматривает путь с начала до конца, т.е. как бы слева направо, наверное в каждый каталог заходит на предмет какой-нить инфы (типа как 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 ), в логе тебе так и напишут: initial URL equal rewritten URL: <здесь URL, о котором идет речь> [IGNORING REWRITE] и так низзя, в чем я убедился на собственном опыте. Если кто-нить видел такое ограничение в мануале, ткните носом, дабы подтвердить свое мнение |