2017-06-13 58 views
1

基於環境變量的存在,我試圖在Apache 2.4 <VirtualHost>中包含一個配置文件。基於環境變量的Apache VirtualHost條件

裏面VirtualHost聲明,我設置了VIEWMODE環境變量,例如:

Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf" 
<VirtualHost *:80> 
     SetEnv VIEWMODE demo 
     Include "${virtualhost_config}" 
</VirtualHost> 

裏面所包含的配置文件,我現在有<Directory>塊內這個條件:

<If "env('VIEWMODE') == 'demo'"> 
    RewriteRule (.*) http://www.apple.com/ [L,R=302] 
</If> 

然而,我似乎無法得到這個工作。條件RewriteRule被忽略。

我錯過了什麼?

+0

在'If'裏面使用'Redirect 302'http://www.apple.com/「',否則我不確定沒有'RewriteEngine On'就可以工作。 – Deadooshka

回答

0

documentation for SetEnv

內部環境通過該指令設置的變量最初請求處理指令都運行之後設定,諸如訪問控制和URI到文件名映射。如果您正在設置的環境變量是輸入到處理的早期階段(如RewriteRule指令)的輸入,則應該使用SetEnvIf來設置環境變量。

和Apache Expresions文檔的功能部分中的note about environment variables感興趣也:

環境變量排序

當環境變量的<If>條件中擡起頭來,這是重要的是要考慮在請求處理的極端早期發生該分辨率。作爲指導,在虛擬主機上下文(目錄,位置,htaccess)之外定義的任何指令都不可能有執行的機會。 SetEnvIf在虛擬主機範圍是,在此之前的分辨率

reqenv使用的<If>外部運行一個指令,將通常稍後發生的分辨率,但確切的定時依賴於表達已內使用的指令。

所以你需要使用SetEnvIf因爲SetEnv不處理很快,並且固定對我來說,當我這裏測試。喜歡的東西:

Define virtualhost_config "${virtualhost_path}/conf/virtualhost.conf" 
<VirtualHost *:80> 
     SetEnvIf Request_URI^VIEWMODE=demo 
     Include "${virtualhost_config}" 
</VirtualHost> 
0

我通過設置一個Apache變量,然後進料到兩個SetEnv指令以及所述<If>塊解決了這個。不幸的是,<If>塊本身似乎會導致其內部的指令的處理順序出現問題(例如ServerAlias not allowed here),但<IfDefine>沒有這個問題(使用<IfDefine>僅適用於我,因爲VIEWMODE是二進制的)。最終的解決方案看起來是這樣的:

Define environment production 
Define viewmode demo 

<VirtualHost *:80> 
    SetEnv ENVIRONMENT ${environment} 
    <IfDefine viewmode> 
     SetEnv VIEWMODE ${viewmode} 
     Include "${virtualhost_path}/conf/demo-configuration.conf" 
    </IfDefine> 
</VirtualHost> 

UnDefine environment 
UnDefine viewmode 

一個重要的警告是,Apache的變量是全球,所以如果相同的變量可能在後續的虛擬主機使用,確保UnDefine他們在每個月底配置。