Apache-2.2

重寫條件反向引用傳遞給所有規則?

  • April 28, 2011

有沒有辦法取回重寫條件的引用以傳遞給所有後續重寫規則?

這是一個例子:

RewriteEngine On    
RewriteCond %{HTTP_HOST} (bob).localhost [NC]    
RewriteRule ^/where/? /index.php\?user_name=%1
RewriteRule ^/who/? /index.php\?user_name=%1 

在這個例子中,我期望這種行為:

http://bob.localhost/where => http://bob.localhost/where/index.php?user_name=bob
http://bob.localhost/who   => http://bob.localhost/who/index.php?usern_ame=bob

但是對於第二條規則,我收到了*http://bob.localhost/who/index.php?user_name=*。

我已經使用 Apache 2.2.17 在幾個不同的發行版上嘗試過這個

條件僅適用於下一條規則。您需要重複該條件才能將其應用於另一條規則:

RewriteCond %{HTTP_HOST} (bob).localhost [NC]    
RewriteRule ^/where/? /index.php\?user_name=%1
RewriteCond %{HTTP_HOST} (bob).localhost [NC]    
RewriteRule ^/who/? /index.php\?user_name=%1 

在您的範例中,如果您的請求的 HTTP_HOST 值匹配(bob).localhost,您的請求將跳過該^/where/?規則(即使它匹配),但可以使用該^/who/?規則。

正如 DerfK 所指出的,rewritecond 僅適用於一個重寫規則。

但是,您可能會考慮另一種策略,即設置和讀取環境變數。

# this grabby rewrite will match anything, 
# *and* set 'bob' in a custom rewrite environment variable 
# it uses 'next' with the 'no sub requests' caveat to avoid loops 
RewriteCond %{HTTP_HOST} (bob).localhost [NC]
RewriteRule ^(.*)$ - [env=host_uname:%1] [N,NS]

# All these rules should then be evaluated, 
# in the 'next' pass - with the 'host_uname' env variable available   
RewriteRule ^/where/? /index.php\?user_name=%{ENV:host_uname}
RewriteRule ^/who/? /index.php\?user_name=%{ENV:host_uname} 

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