Назад | Перейти на главную страницу

RewriteRule применяет шаблон, даже если 1 из RewriteCond не удалось

                                                              #www.   domain .   tld
RewriteCond     %{HTTP_HOST}                                (?:.*\.)?([^.]+)\.(?:[^.]+)$
RewriteCond     /home/%1/                                   -d
RewriteRule     ^(.+)                                       %{HTTP_HOST}$1
RewriteRule     (?:.*\.)?([^.]+)\.(?:[^.]+)/media/(.*)$    /home/$1/client/media/$2 [L] 
RewriteRule     (?:.*\.)?([^.]+)\.(?:[^.]+)/(.*)$          /home/$1/www/$2 [L] 

Вот вывод rewritelog:

#(4) RewriteCond: input='tfnoo.mydomain.org' pattern='(?:.*\.)?([^.]+)\.(?:[^.]+)$' [NC] => matched
#(4) RewriteCond: input='/home/mydomain/' pattern='-d'
=> not-matched
#(3) applying pattern '(?:.*\.)?([^.]+)\.(?:[^.]+)/media/(.*)$' to uri 'http://www.mydomain.org/files/images/logo.png'
#(3) applying pattern '(?:.*\.)?([^.]+)\.(?:[^.]+)/(.*)$' to uri 'http://www.mydomain.org/files/images/logo.png'
#(2) rewrite 'http://www.mydomain.org/files/images/logo.png'
-> '/home/mydomain/www/logo.png'

Если вы заметили, что 2-й 4-й отказал шаблон -d (если каталог существует). Что правильно. mydomain не имеет / home /. Следовательно, он никогда не должен перезаписывать, по крайней мере, в соответствии с моим пониманием, что все rewriterules подлежат rewriteconds как логические AND.

Нет, только правило, которое следует за одним или несколькими RewriteCond директивы включены. То есть:

                                                          #www.   domain .   tld
RewriteCond     %{HTTP_HOST}                                (?:.*\.)?([^.]+)\.(?:[^.]+)$
RewriteCond     /home/%1/                                   -d
# This will only be run if the two conditions above, are met
RewriteRule     ^(.+)                                       %{HTTP_HOST}$1

# These will always be run!
RewriteRule     (?:.*\.)?([^.]+)\.(?:[^.]+)/media/(.*)$    /home/$1/client/media/$2 [L] 
RewriteRule     (?:.*\.)?([^.]+)\.(?:[^.]+)/(.*)$          /home/$1/www/$2 [L] 

Если вы заметили в своем журнале, он пропускает первый RewriteRule, но даже не проверяет условия для двух других.