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

Форум Apache

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

 

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

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

тема: mod_rewrite - странное поведение
 
 автор: MsJulia   (10.08.2012 в 11:48)   письмо автору
 
 

скажите кто-нибудь, что вернёт такой реврайт, при запросе мойсайт.рф/один/четыре

RewriteRule один два?три=3 [QSA,R]
RewriteRule четыре ?пять=5 [QSA,R]

И главное, почему он возвращает оба параметра, если везде пишут что URL изменяется полностью от правила к правилу?

  Ответить  
 
 автор: cheops   (12.08.2012 в 19:30)   письмо автору
 
   для: MsJulia   (10.08.2012 в 11:48)
 

Пробелы в URL не допустимы, mod_rewrite не может работать с такими URL. С GET-параметрами после ? он тоже не работает, он их может передать, но составить регулярное выражение для них нельзя.

  Ответить  
 
 автор: MsJulia   (13.08.2012 в 02:29)   письмо автору
 
   для: cheops   (12.08.2012 в 19:30)
 

это не пробелы в урл - это правая и левая части правила...

  Ответить  
 
 автор: cheops   (13.08.2012 в 07:35)   письмо автору
 
   для: MsJulia   (13.08.2012 в 02:29)
 

Да, в самом деле, не заметил. У вас в какой кодировке русский текст (не уверен, что mod_rewrite без дополнительного ковыряния вообще его поддерживает)?

  Ответить  
 
 автор: MsJulia   (14.08.2012 в 00:01)   письмо автору
 
   для: cheops   (13.08.2012 в 07:35)
 

RewriteRule one two?three=3 [QSA,R]
RewriteRule four ?five=5 [QSA,R]

На запрос site.com/one/four

Почему приходят оба параметра, и что приходит на обработку во второе правило?
Везде пишут что преобразование идёт ПООЧЕРЁДНО с заменой всего URL от правила к правилу...

  Ответить  
 
 автор: cheops   (14.08.2012 в 07:46)   письмо автору
 
   для: MsJulia   (14.08.2012 в 00:01)
 

А в смысле оба параметра приходят? Какой вбиваете адрес в строку запроса и какие параметры при этом становятся доступными скрипту?

  Ответить  
 
 автор: MsJulia   (15.08.2012 в 12:21)   письмо автору
 
   для: cheops   (14.08.2012 в 07:46)
 

RewriteRule one two?three=3 [QSA,R]
RewriteRule four ?five=5 [QSA,R]

На запрос - site.com/one/four - ВОЗВРАЩАЕТ - site.com?five=5&three=3
то есть оба параметра..

Если рассуждать логически и думать что URL изменяется от правила к правилу ПОЛНОСТЬЮ, то во второе правило должно войти site.com/two?three=3 и второе правило не должно сработать, но оно срабатывает... почему?

  Ответить  
 
 автор: Sfinks   (17.08.2012 в 09:37)   письмо автору
 
   для: MsJulia   (15.08.2012 в 12:21)
 

Заменяется не вся ссылка, а то, что подходит под регулярное выражение.
Тут случай на самом деле тяжелый для понимания. Думаю, что после первой замены остается:
site.com/two/four?three=3
а после второй, то что вы написали. Можете проверить это убрав временно второе правило.

Если вы хотите избежать этого, то используйте символы начала (^) и(или) конца ($) строки:
RewriteRule one$ two?three=3 [QSA,R]
RewriteRule four$ ?five=5 [QSA,R]

  Ответить  
 
 автор: MsJulia   (17.08.2012 в 14:11)   письмо автору
 
   для: Sfinks   (17.08.2012 в 09:37)
 

Если вы хотите избежать этого
*Тут случай на самом деле тяжелый для понимания


Да нет же, понять хочу )))

Думаю, что после первой замены остается...

Нет, я проверял. Логика ваша - заменяет только то что нашёл по первому правилу, плюс ко всему - во второе правило приходит ПОЛНЫЙ путь к файлу на сервере от корня, а не URL !!!

То есть, в моём случае во второе правило пришло:
/var/www/site.com/two/four?three=3


Так как это вообще понимать вашу))) Во всех документах которые я успел прочитать, во всех статьях типа "Мод реврайт - просто о сложном..." и тд и даже в англоязычном доке который мне скидывал мой хостер - везде написано что URL изменяется полностью от правила к правилу.

Оказывается, полностью меняется только то, что найдено по регулярке. Так почему это нигде не описано?? И если описано, дайте пожалуйста ссыль на док, мне очень надо именно разобраться в последовательной работе правил. Поскольку назначение символов
 начала (^) и(или) конца ($) строки, а также флага [L] 

мне вполне известны.

Хочестя так, сказать узреть корень ;))

Sfinks, помогите разобраться. Пожалуйста :(

Получается, что до выхода из MOD_Rewrite url переводится в ПУТЬ к файлу если такой имеется на сервере, а уже на выходе из MOD-a, на последнем правиле, ПУТЬ превращается обратно в URL ?

В моём случае это было так

- site.com/one/four -
- /var/www/site.com/two/four?three=3 -
- site.com?five=5&three=3 -


И опять же. Если как вы говорите "Заменяется не вся ссылка, а то, что подходит под регулярное выражение." куда же делась часть "/two/" из URL если вторым правилом должно было замениться только часть регулярки "/four/".............?

  Ответить  
 
 автор: Sfinks   (18.08.2012 в 14:18)   письмо автору
 
   для: MsJulia   (17.08.2012 в 14:11)
 

Куда делась часть two - это и для меня загадка. Сразу ее отсутствие я просмотрел.
Постичь логику мод_реврайта досконально мне пока не далось.
А все потому (в этом же и ответы на все ваши вопросы), что все мануалы, которые я видел в сети - старьё, относящееся к апачу 1.3. А в апаче 2.х мод_реврайт ведет себя несколько по другому. Познавать тонкости приходится методом тыка.
Например я ни разу еще не видел, чтоб [L] вело себя так, как это документировано. У меня всегда тупо игнорируется и приходится менять правила местами, продумывать возможные подстановки, в общем прерывать цепочку замен просто исключая возможность совпадения с шаблоном.
А например после того как встречается [R] цепь реврайтов тоже должна прерываться и происходить внешний редирект. А если редирект происходит на тот же сайт и попадает на тот же .htaccess (как у вас), то все правила просмативаются с самого начала. У вас же что-то не понятное происходит.

Резюмирую:
Самое полное описание mod_rewrite, которое мне помогло хоть что-то в нем понять, вот: http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html
Также можете попробовать включить log мод_реврайта и поразбираться с ним. Но в него очень грустно смотреть, особенно если много правил.... Там такая куча строк и букаф странных =))))

  Ответить  
 
 автор: MsJulia   (18.08.2012 в 23:15)   письмо автору
 
   для: Sfinks   (18.08.2012 в 14:18)
 

Короче - пижнес полный...

> А например после того как встречается [R] цепь реврайтов тоже должна прерываться
[R] - запоминает необходимость редиректа, но НЕ останавливает работу реврайта

> У меня всегда тупо игнорируется и приходится менять правила местами
[L] - останавливает текущую интерацию, а новый url выхода будет обрабатываться снова

Что мне стало известно, ПОЛНОСТЬЮ url изменяется только последним правилом......
пижнес :(

  Ответить  
 
 автор: MsJulia   (05.09.2012 в 11:34)   письмо автору
 
   для: MsJulia   (18.08.2012 в 23:15)
 

НАШЁЛ !!! Весьма случайно:

Примечание (http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html)

Никогда не забываёте что Шаблон применяется ко всему URL в конфигурационных файла сервера. Однако в конфигурационных файлах каталогов, префикс каталога (который всегда одинаков для конкретного каталога !), автоматически удаляется при соответствии шаблону и автоматически добавляется после завершения подстановки. Эта особенность, основа для многих видов преобразований, потому что без удаления префикса для родительского каталога тоже должно быть соответствие, что не всегда возможно.

  Ответить  
Rambler's Top100
вверх

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