即使 RewriteCond 中的一个失败,RewriteRule 仍会应用模式

即使 RewriteCond 中的一个失败,RewriteRule 仍会应用模式
                                                              #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] 

以下是重写日志的输出:

#(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'

如果您注意到第二个 4,则它失败了 -d(如果目录存在)模式。这是正确的。mydomain 没有 /home/。因此它永远不应该重写,至少根据我的理解,所有重写规则都受 rewriteconds 的约束,作为逻辑 AND。

答案1

不,仅包含紧跟在一个或多个指令之后的规则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,但甚至不会检查其他两个的条件。

相关内容