Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Параметры после ? в mod_rewrite
 
 автор: faeton   (05.05.2008 в 09:16)   письмо автору
 
 

Мне нужно реализовать переадресацию с добавлением одного параметра (url)
примеры:
1:
aaa/bbb/ccc
преобразовать в
view.php?url=aaa/bbb/ccc

2:
aaa/bbb/ccc?mode=nnn
преобразовать в
view.php?mode=nnn&url=aaa/bbb/ccc

т. е. необходимо сохранить все параметры переданные от пользователя

   
 
 автор: Maya   (06.05.2008 в 09:08)   письмо автору
 
   для: faeton   (05.05.2008 в 09:16)
 

По первому примеру у меня работает конструкция:
RewriteRule  ^(([a-z]+)(\/)([a-z]+)(\/)([a-z]+))$             view.php?url=$1

А по второму непонятно, зачем городить: ?mode=nnn
добавьте просто aaa/bbb/ccc/nnn, а в правилах считайте nnn, как вторую переменную.

Вот здесь я отвечала на подобный вопрос.

Только у вас aaa/bbb/ccc - это одна переменная, поэтому и описывается она одним выражением, а в том примере 3 разных переменных, соответственно 3 выражения.

   
 
 автор: Atheist   (06.05.2008 в 11:03)   письмо автору
 
   для: faeton   (05.05.2008 в 09:16)
 

Добавь &%{QUERY_STRING} к адресу перенаправления.

   
 
 автор: Eugene77   (06.05.2008 в 20:32)   письмо автору
 
   для: Atheist   (06.05.2008 в 11:03)
 

Вот так что ли вы советуете?
RewriteRule ^(([a-z]+)(\/)([a-z]+)(\/)([a-z]+))?$ view.php?url=$1&%{QUERY_STRING}
Или без вопроса?

   
 
 автор: faeton   (07.05.2008 в 09:28)   письмо автору
 
   для: Eugene77   (06.05.2008 в 20:32)
 

Я еще плохо знаю регулярные выражения
что значит
(\/)

В моей задаче необязательно будет
aa/bb/cc

могут быть и другие варианты
a/bb
и даже вариант
/

у меня было реализованно аналогичное но с меньшими возможностями так
RewriteRule ^$ /article/index.php
RewriteRule ^([0-9\w/]+)/([0-9\w]+)$ /article/index.php?dir=$1&fn=$2
RewriteRule ^([0-9\w/]+)/$ /article/index.php?dir=$1
RewriteRule ^([0-9\w/]+)&([\w]+)$ /article/index.php?fn=$1&mode=$2

   
 
 автор: Atheist   (07.05.2008 в 12:32)   письмо автору
 
   для: Eugene77   (06.05.2008 в 20:32)
 

> Вот так что ли вы советуете?
Да.

> что значит
> (\/)
Это что-то напоминает...:)) А вообще это ошибка: экранировать слеш тут не надо и скобочки не нужны, т.е. просто "/" ( без кавычек)

   
 
 автор: Maya   (07.05.2008 в 13:08)   письмо автору
 
   для: Atheist   (07.05.2008 в 12:32)
 

В примере:
url=aaa/bbb/ccc
aaa/bbb/ccc - это значение переменной url и ее нужно описать с экранированием слеша, т.к. в данном случае это составляющая переменной (я, правда, не понимаю, зачем в значении слеши).
Можно, конечно, и по-другому описать, в зависимости от того, какие значения может принимать переменная url

   
 
 автор: Atheist   (07.05.2008 в 13:33)   письмо автору
 
   для: Maya   (07.05.2008 в 13:08)
 

> в данном случае это составляющая переменной
Нет тут никаких переменных для mod_rewrite. Это просто строка "url=aaa/bbb/ccc".

   
 
 автор: Maya   (07.05.2008 в 14:30)   письмо автору
 
   для: Atheist   (07.05.2008 в 13:33)
 

Документация, в которой описаны 3 типа переменных в правилах преобразования строки с помощью программного модуля mod_rewrite веб сервера Apache и регулярных выражений.

   
 
 автор: Atheist   (08.05.2008 в 13:11)   письмо автору
 
   для: Maya   (07.05.2008 в 14:30)
 

Maya, процитируете оттуда то место, которое пытаетесь объяснить мне?

> В примере:
> url=aaa/bbb/ccc
> aaa/bbb/ccc - это значение переменной url и ее нужно описать с экранированием слеша
Вы предлагаетe "url=aaa\/bbb\/ccc"?

   
 
 автор: Maya   (08.05.2008 в 19:36)   письмо автору
 
   для: Atheist   (08.05.2008 в 13:11)
 

Вы предлагаетe "url=aaa\/bbb\/ccc"?
Нет. Думаю, что мы вообще говорили с вами о разных вещах.
Из вопроса следует, что строка "view.php?url=aaa/bbb/ccc" - это исходная строка,
где $_GET['url']="aaa/bbb/ccc";
т.е. значение переменной url, которая может принимать значения:
ddd/eee/fff, jjj/hhh/iii и т.д.
Именно в этом контексте я предложила вышенаписанное правило,не додумывая и не спрашивая, зачем в значении переменной слеши. Я не права? Поправьте меня.
А ссылка на мануал в ответ на фразу Нет тут никаких переменных для mod_rewrite
Back-references are $N (N=0..9) identifiers which will be replaced by the contents of the Nth group of the matched Pattern. The server-variables are the same as for the TestString of a RewriteCond directive. The mapping-functions come from the RewriteMap directive and are explained there. These three types of variables are expanded in the order of the above list.
Хотя я слышала, что $N иногда называют и макросом.

   
 
 автор: Atheist   (08.05.2008 в 22:56)   письмо автору
 
   для: Maya   (08.05.2008 в 19:36)
 

Ах вот Вы о чём :)

Попробуйте:
RewriteRule  ^([a-z]+)/([a-z]+)/([a-z]+)$             index.php?url=$0

Я убрал экранирование слешей. Это что-то изменило?

> aaa/bbb/ccc - это значение переменной url и ее нужно описать с экранированием слеша, т.к. в данном случае это составляющая переменной
И не видел я в той же доментации указание на то, что надо экранировать слеши, в случае когда они попадут в значение переменной.

   
 
 автор: Maya   (09.05.2008 в 03:38)   письмо автору
 
   для: Atheist   (08.05.2008 в 22:56)
 

Конечно, изменило, если, конечно, это правило не единственное. Вы хотите поговорить об этом? :))
И не видел я в той же доментации указание на то

Это в другой уже смотреть надо. Регулярные выражения :)
Хотя и не настаиваю.

   
 
 автор: Atheist   (09.05.2008 в 16:28)   письмо автору
 
   для: Maya   (09.05.2008 в 03:38)
 

> Это в другой уже смотреть надо. Регулярные выражения :)
Слеш экранируется в PCRE, только если он используется в качестве ограничителей паттерна. В Perl и JavaScript, кажется, они фиксированные, в PHP, как Вы знаете, они могут быть любые, кроме alphanumeric и бекслеша, а в mod_rewrite это просто пробельные символы.

> Конечно, изменило, если, конечно, это правило не единственное. Вы хотите поговорить об этом? :))
Я ничего не понял из этого. Да, хочу :)

   
 
 автор: faeton   (08.05.2008 в 12:02)   письмо автору
 
   для: Atheist   (07.05.2008 в 12:32)
 

Все, подходящий вариант найден спасибо
RewriteRule ^([\w/]+)$ /article/index.php?url=$1&%{QUERY_STRING}
RewriteRule ^$ /article/index.php?%{QUERY_STRING}

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования