Apache-2.2

RewriteRule 應用模式,即使 RewriteCond 的 1 個失敗

  • January 2, 2011
                                                             #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'

如果您在 2nd 4 上註意到它失敗了 -d (如果目錄存在)模式。哪個是對的。mydomain 沒有 /home/。因此,它永遠不應該重寫,至少根據我的理解,所有重寫規則都受重寫條件作為邏輯 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,但甚至不會檢查其他兩個的條件。

引用自:https://serverfault.com/questions/217894