Ru-Board.club
← Вернуться в раздел «Web-программирование»

» mod_rewrite: документация, готовые решения, вопросы

Автор: Cheery
Дата сообщения: 01.02.2013 08:43
mishakor
включите на время логи обработки mod_rewrite и станет очевидно в чем дело
да и с чего должно срабатывать в корне, если вы указали


Цитата:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l


то есть срабатывать, когда запрос идет к несуществующему файлу, папке, линку.
при обращении к корню сайта вы обращаетесь к папке, которая существует
Автор: mishakor
Дата сообщения: 05.02.2013 08:11
огромнейшее спасибо, убрал вторую строку, заработало!
Автор: unreal666
Дата сообщения: 26.03.2013 15:08
Такой вопрос.
Скачал исходники сайта html5test.com .
У него в корне лежит такой .htaccess.

Код: AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.html5test\.com$
RewriteRule ^ http://html5test.com%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com
RewriteRule ^translation.js$                /translations/cn/index.js

RewriteRule ^translation.js$                /translations/en/index.js

RewriteRule ^compare.html$                    /compare/browser/index.html                                [R]
RewriteRule ^results.html$                    /results/desktop.html                                    [R]
RewriteRule ^results-mobile.html$            /results/mobile.html                                    [R]
RewriteRule ^results-tablets.html$            /results/tablet.html                                    [R]
RewriteRule ^results-tv.html$                /results/television.html                                [R]

RewriteRule ^api/(.+)$                         /backend/index.php?method=$1&%{QUERY_STRING}
RewriteRule ^compare/browser/index.html$     /backend/browser.php?%{QUERY_STRING}
RewriteRule ^compare/browser/(.+).html$     /backend/browser.php?show=$1&%{QUERY_STRING}
RewriteRule ^compare/feature/index.html$     /backend/feature.php?%{QUERY_STRING}
RewriteRule ^compare/feature/(.+).html$     /backend/feature.php?show=$1&%{QUERY_STRING}
RewriteRule ^results/desktop.html$            /backend/results.php?type=desktop
RewriteRule ^results/mobile.html$            /backend/results.php?type=mobile
RewriteRule ^results/tablet.html$            /backend/results.php?type=tablet
RewriteRule ^results/gaming.html$            /backend/results.php?type=gaming
RewriteRule ^results/television.html$        /backend/results.php?type=television
Автор: Cheery
Дата сообщения: 26.03.2013 18:19
unreal666

Цитата:
Пустая строка прерывает условие RewriteCond что ли?

нет.
RewriteCond работает на следующий RewriteRule
на самом деле срабатывает сначала RewriteRule, а затем проверяются RewriteCond над ним.

вот тут все отлично описано
http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html
Автор: unreal666
Дата сообщения: 26.03.2013 18:27
Cheery
я чего спросил.
В вышеприведенном .htaccess правила ниже "RewriteRule ^translation.js$ /translations/cn/index.js" никаким боком не связаны с условием "RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com", т/е/ они действуют и на просто html5test.com безо всяких там префикса cn. впереди.
Почему же тогда они срабатывают?
Автор: Cheery
Дата сообщения: 26.03.2013 18:30
unreal666

Цитата:
Почему же тогда они срабатывают

RewriteCond накладывает дополнительные условия, они необязательны.

Сказал же - сначала идет проверка шаблона в RewriteRule, если совпадает, тогда идет проверка RewriteCond (если есть).


Цитата:
RewriteRule ^translation.js$                /translations/en/index.js

срабатывает, если идет обращение к translation.js в данной папке или корне сайта (смотря где находятся условия)
Автор: unreal666
Дата сообщения: 26.03.2013 18:47

Цитата:
Сказал же - сначала идет проверка шаблона в RewriteRule, если совпадает, тогда идет проверка RewriteCond (если есть).

вот это и не понял.
Правило совпало => смотрим выше на присутствие RewriteCond => условие в RewriteCond не соответствует => по фигу, что не соответствует; все равно сделаем преобразование.
Так что ли?


Цитата:
срабатывает, если идет обращение к translation.js в данной папке или корне сайта (смотря где находятся условия)

почему? Выше же есть правило, которое тоже подпадает под это. Или mod_rewrite в рандомном порядке их ищет?
Автор: Cheery
Дата сообщения: 26.03.2013 18:50
unreal666

Цитата:
условие в RewriteCond не соответствует => так с какого перепугу все равно правило сработает?


а почему вы решили, что срабатывает именно переброс на китайскую трансляцию?
а не следующее правило, перекидывающее на английский вариант?

китайское не должно (если не с домена beta.cn.html5test.com или cn.html5test.com), а английское может

если нужны подробности обработки - включайте, на время, логгирование для mod_rewrite
Автор: unreal666
Дата сообщения: 26.03.2013 20:02
потестил с 9-м уровнем логирования.
Чего-то у меня получилось, что если правило в RewriteRule совпало, но при этом не совпало вышележащее условие RewriteCond, то это условие в дальнейшем игнорируется.
Автор: Cheery
Дата сообщения: 26.03.2013 20:12
unreal666

Цитата:
но при этом не совпало вышележащее условие RewriteCond, то это условие в дальнейшем игнорируется.

ну, а я о чем говорил выше?
сначала RewriteRule, потом проверяется RewriteCond
Автор: unreal666
Дата сообщения: 26.03.2013 20:19
ну так ты же не говорил, что, если RewriteCond не совпал, то он просто отбрасывается (в последующем игнорируется) вместе со своим совпавшим RewriteRule.
Автор: Cheery
Дата сообщения: 26.03.2013 20:25
unreal666

Цитата:
так ты же не говорил, что, если RewriteCond не совпал, то он просто отбрасывается (в последующем игнорируется) вместе со своим совпавшим RewriteRule.

почему это не говорил?


Цитата:
Сказал же - сначала идет проверка шаблона в RewriteRule, если совпадает, тогда идет проверка RewriteCond (если есть).

какой смысл во второй проверке тогда? чтобы RewriteRule фактически выполнился, если удовлетворяется и RewriteCond

Автор: unreal666
Дата сообщения: 26.03.2013 20:30

Цитата:
какой смысл во второй проверке тогда?

а я про это и не говорил. Просто для меня при не совпадении RewriteCond было бы логичнее вообще отбросить все нижележащие правила до следующего RewriteCond. Тогда и 2-ая проверка не нужна была бы.
Автор: Cheery
Дата сообщения: 26.03.2013 20:33
unreal666

Цитата:
RewriteCond было бы логичнее вообще отбросить все нижележащие правила до следующего RewriteCond

так и делается.

но исторически обработка начинается с RewriteRule - почитайте же ссылку

Цитата:
Порядок правил в наборе важен потому что механизм преобразований обрабатывает их в специальном (и не очень очевидном) порядке. RewriteRule директивы просматриваются механизмом преобразований строчка за строчкой и при нахождении соответствия конкретному правилу просматриваются относящиеся к этому правилу условия (RewriteCond директивы). По историческим причинам условия находятся перед правилами, отсюда длиннее последовательность выполнения команд.


поэтому, в принципе, получается тот же самый "отброс от rewritecond (всей группы) до первого rewriterule включительно", просто выполняется иначе.
Автор: unreal666
Дата сообщения: 26.03.2013 20:44

Цитата:
почитайте же ссылку

да читал. Только там невнятно описано. Была бы нормальная блок схема с "соответствует"/"не соответствует", было бы понятнее. А то там только порядок обработки нарисован. А вот разветвлений типа "если" там нет.
В описании ниже рисунка тоже как то фигово объяснено про этот алгоритм при разных условиях.
Автор: Cheery
Дата сообщения: 26.03.2013 20:47
unreal666
там все отлично написано (лучше, чем где либо еще), нужно лишь вникнуть.
+ http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

Цитата:
The RewriteCond directive defines a rule condition. One or more RewriteCond can precede a RewriteRule directive. The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.
Автор: unreal666
Дата сообщения: 26.03.2013 21:00
из этого не следует вышеописанное.
Автор: Cheery
Дата сообщения: 26.03.2013 21:05
unreal666

Цитата:
из этого не следует вышеописанное.

надоел мне этот флейм ни о чем.. следует и работает.

если есть сомнения - показывайте на примере.
Автор: unreal666
Дата сообщения: 26.03.2013 21:24

Цитата:
One or more RewriteCond can precede a RewriteRule directive

тот же .htaccess. Перед RewriteRule есть RewriteCond => подходит.
------------
URL http://html5test.com/translation.js. .htaccess в корне сайта.

Код: The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.
Автор: Cheery
Дата сообщения: 26.03.2013 21:26
unreal666

Цитата:
все равно преобразуем.

логи покажите.. я не верю, что преобразуется.


Цитата:
хотя логичнее было бы игнорировать сами эти правила до следующего RewriteCond.

игнорируется только один rewriterule, который идет за (в файле) группой rewritecond

rewriterule может быть один, сам по себе, без rewritecond.

поэтому

rewritecond условие1
rewriterule /путь /путь2

rewriterule /путь /путь3

если попадаем под /путь, но не выполняется условие1, то игнорируется
Цитата:
rewriterule /путь /путь2
, но
Цитата:
rewriterule /путь /путь3

выполняется всегда, если не изменился /путь на что то иное правилами до данного
Автор: unreal666
Дата сообщения: 26.03.2013 21:28
если было так

Код: RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com
RewriteRule ^translation.js$                /translations/cn/index.js

RewriteRule ^translation.js$                /translations/en/index.js

RewriteCond %{HTTP_HOST} ^
здесь другие правила
Автор: Cheery
Дата сообщения: 26.03.2013 21:30
unreal666

Цитата:
то было бы понятнее

ну так укажите разработчикам апача как бы вам хотелось видеть правила.
зачем флейм то в данной теме разводить?

меня (да и не только меня) они устраивают пока как есть..
да, бывают сложности, но решаются.
Автор: unreal666
Дата сообщения: 26.03.2013 21:31

Цитата:
логи покажите.. я не верю, что преобразуется.

так уже же разобрались, что на китайском сайте преобразуется на китайский translation.js, а на любом другом - на англиский.

Вот лог

Код: (3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js
(3) applying pattern '^' to uri 'translation.js'
(4) RewriteCond: input='html5test.loc' pattern='^www\.html5test\.loc$' => not-matched

(3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js
(3) applying pattern '^translation.js$' to uri 'translation.js'
(4) RewriteCond: input='html5test.loc' pattern='^(beta.)?cn.html5test.loc' => not-matched

(3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js
(3) applying pattern '^translation.js$' to uri 'translation.js'
(2) rewrite 'translation.js' -> '/translations/en/index.js'
Автор: Cheery
Дата сообщения: 26.03.2013 21:32
unreal666

Цитата:
так уже же разобрались, что на китайском сайте преобразуется на китайский translation.js, а на любом другом - на англиский.

так в чем проблем то тогда?
в том, что считаете, что это неудобно?

тогда, как и сказал,

Цитата:
ну так укажите разработчикам апача как бы вам хотелось видеть правила.
зачем флейм то в данной теме разводить?

Автор: unreal666
Дата сообщения: 26.03.2013 21:33

Цитата:
ну так укажите разработчикам апача как бы вам хотелось видеть правила.
зачем флейм то в данной теме разводить?

проблема не в том, как он это делает, а в том, что этот нюанс не описан.
Автор: Cheery
Дата сообщения: 26.03.2013 21:36
unreal666

Цитата:
проблема не в том, как он это делает, а в том, что этот нюанс не описан.

какой ньюанс? там все написано, это вы неправильно истолковываете.
в сотый раз повторяю - я же правильно понял, а изучал именно по этой ссылке и по мануалу.

Цитата:
The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.

RewriteRule, следующий за этими RewriteCond, используется тогда и только в том случе, если URI на данный момент попадает под шаблон в RewriteRule (о котором шла речь выше) и эти условия (во всех RewriteCond до упомянутого ранее RewriteRule) выполняются.
Что не так?
Автор: unreal666
Дата сообщения: 26.03.2013 21:42

Цитата:
Что не так?

то что вышеуказанный URI подпадает под "RewriteRule, следующий за этим RewriteCond" и под паттерн попадает, но эти условия "RewriteCond до упомянутого ранее RewriteRule" (минимум одно) не выполняются. Но при этом преобразование все равно происходит.

Цитата:
там все написано, это вы неправильно истолковываете.

Значит написано не все. Было бы все, то не так невозможно было бы истолковать.
Автор: Cheery
Дата сообщения: 26.03.2013 21:43
unreal666

Цитата:
то что вышеуказанный URI подпадает под "RewriteRule, следующий за этим RewriteCond" и под паттерн попадает, но эти условия (минимум одно) не выполняются. Но при этом преобразование все равно происходит.

блин.. да где оно происходит?

Цитата:
(3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js
(3) applying pattern '^translation.js$' to uri 'translation.js'
(2) rewrite 'translation.js' -> '/translations/en/index.js'

это уже ДРУГОЕ rewriterule, без условий! rewritecond влияют только на ОДИН rewriterule, который следует прямо за ними. это явно сказано в переводе выделенного куска ранее.

все, меня достал этот флейм. не хотите вчитываться - ваше дело.
Автор: unreal666
Дата сообщения: 26.03.2013 21:47

Цитата:
это уже ДРУГОЕ rewriterule, без условий!

без каких условий?
Это правило подпадает под "во всех RewriteCond до упомянутого ранее RewriteRule".
- RewriteCond выше есть?
- Есть.
- Так куда оно делось?
- mod_rewrite его выкинул из своего списка просматриваемых правил.
- где про это написано?
- нигде.
Автор: Cheery
Дата сообщения: 26.03.2013 21:49
unreal666

Цитата:
без каких условий?

произведем цветовое разделение
RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com
RewriteRule ^translation.js$ /translations/cn/index.js


RewriteRule ^translation.js$ /translations/en/index.js

у зеленого RewriteRule есть условие. у красного - нет.
красное не читает зеленые условия, потому что они не относятся к нему.


Цитата:
во всех RewriteCond

все, после предыдущего RewriteRule и до следующего после данных условий.
в мануале о подобном и говорится, что условия действуют только на первый (после них) rewriterule, а не на любой другой rewriterule после него.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Предыдущая тема: PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.