2013-10-14 43 views
4

在我.htaccess我設置:的RewriteCond與SETENV

SetEnv APPLICATION_ENV development 

我要檢查,如果APPLICATION_ENV等於development然後運行app_dev.php,否則app.php

SetEnv APPLICATION_ENV development 

RewriteCond %{ENV:APPLICATION_ENV} development 
RewriteRule .? %{ENV:BASE}/app_dev.php [L] 
RewriteRule .? %{ENV:BASE}/app.php [L] 

但是它不工作 - 始終運行app.php腳本。我應該如何解決它?

回答

10

因爲我有這個測試自己,只能確認你寫的是正確的,我開始環顧四周,發現這個post關於SetEnvSetEnvIfRewriteRule知名度。它看起來像SetEnv是不可見的RewriteCond,如果我改變你的例子來使用:

SetEnvIf APPLICATION_ENV ^(.*)$ APPLICATION_ENV=development 

我居然讓你必須加載app_dev.php規則。你可以使用RewriteRule以及設置變量:

RewriteRule .* - [E=APPLICATION_ENV:development,NE] 

然而,貌似SetEnv不能使用(測試的Apache 2.2.22)。

編輯
作爲julp在評論中指出這個帖子這是Apache的文檔部分Setting Environment Variables相當明確:

The SetEnv directive runs late during request processing meaning that directives 
such as SetEnvIf and RewriteCond will not see the variables set with it. 
+1

你是對的,對此的解釋是[Apache文檔(HTTP中://httpd.apache.org/docs/2.2/en/mod/mod_env.html#setenv):該指令[SetEnv]設置的內部環境變量是在大多數提前請求處理指令運行後設置的,例如訪問控制和URI到文件名映射。如果您正在設置的環境變量是輸入到處理的早期階段(如RewriteRule指令)的輸入,則應該使用SetEnvIf設置環境變量。 – julp

+0

我已經在apache2上測試過這個問題,因爲OP沒有更好的結果。 – jacouh

+0

@ julp啊,謝謝,我不明白我在閱讀時可能會錯過它。很高興在官方文檔中解釋它。 – Qben