|
|
|
| скажите кто-нибудь, что вернёт такой реврайт, при запросе мойсайт.рф/один/четыре
RewriteRule один два?три=3 [QSA,R]
RewriteRule четыре ?пять=5 [QSA,R]
И главное, почему он возвращает оба параметра, если везде пишут что URL изменяется полностью от правила к правилу? | |
|
|
|
|
|
|
|
для: MsJulia
(10.08.2012 в 11:48)
| | Пробелы в URL не допустимы, mod_rewrite не может работать с такими URL. С GET-параметрами после ? он тоже не работает, он их может передать, но составить регулярное выражение для них нельзя. | |
|
|
|
|
|
|
|
для: cheops
(12.08.2012 в 19:30)
| | это не пробелы в урл - это правая и левая части правила... | |
|
|
|
|
|
|
|
для: MsJulia
(13.08.2012 в 02:29)
| | Да, в самом деле, не заметил. У вас в какой кодировке русский текст (не уверен, что mod_rewrite без дополнительного ковыряния вообще его поддерживает)? | |
|
|
|
|
|
|
|
для: cheops
(13.08.2012 в 07:35)
| | RewriteRule one two?three=3 [QSA,R]
RewriteRule four ?five=5 [QSA,R]
На запрос site.com/one/four
Почему приходят оба параметра, и что приходит на обработку во второе правило?
Везде пишут что преобразование идёт ПООЧЕРЁДНО с заменой всего URL от правила к правилу... | |
|
|
|
|
|
|
|
для: MsJulia
(14.08.2012 в 00:01)
| | А в смысле оба параметра приходят? Какой вбиваете адрес в строку запроса и какие параметры при этом становятся доступными скрипту? | |
|
|
|
|
|
|
|
для: 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 и второе правило не должно сработать, но оно срабатывает... почему? | |
|
|
|
|
|
|
|
для: 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]
|
| |
|
|
|
|
|
|
|
для: 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/".............? | |
|
|
|
|
|
|
|
для: 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 мод_реврайта и поразбираться с ним. Но в него очень грустно смотреть, особенно если много правил.... Там такая куча строк и букаф странных =)))) | |
|
|
|
|
|
|
|
для: Sfinks
(18.08.2012 в 14:18)
| | Короче - пижнес полный...
> А например после того как встречается [R] цепь реврайтов тоже должна прерываться
[R] - запоминает необходимость редиректа, но НЕ останавливает работу реврайта
> У меня всегда тупо игнорируется и приходится менять правила местами
[L] - останавливает текущую интерацию, а новый url выхода будет обрабатываться снова
Что мне стало известно, ПОЛНОСТЬЮ url изменяется только последним правилом......
пижнес :( | |
|
|
|
|
|
|
|
для: MsJulia
(18.08.2012 в 23:15)
| | НАШЁЛ !!! Весьма случайно:
Примечание (http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html)
Никогда не забываёте что Шаблон применяется ко всему URL в конфигурационных файла сервера. Однако в конфигурационных файлах каталогов, префикс каталога (который всегда одинаков для конкретного каталога !), автоматически удаляется при соответствии шаблону и автоматически добавляется после завершения подстановки. Эта особенность, основа для многих видов преобразований, потому что без удаления префикса для родительского каталога тоже должно быть соответствие, что не всегда возможно. | |
|
|
|