2012-07-08 41 views
2

我的問題是關於使用SetEnvIf以及我如何才能正確使用環境變量,因爲我需要它們。我將解釋我需要做什麼,然後我已經有...Apache SetEnvIf和使用%{ENV:...}

我需要在我的htaccess文件中設置PHP應用程序目錄,因爲一些重寫規則使用該目錄名稱,我試圖以允許管理員用戶改變它的能力。它目前在php中設置,並且在htaccess文件中手動完成更改,然後再次在php中完成。要做到這一點,我現在有

SetEnvIf SERVER_PROTOCOL ".*" APP_DIR=application 

它設置了這種方式來獲得之前的任何重寫規則的環境變量設置如下(使用ENV關於採取建議瓦爾在重寫規則),作爲SetEnv被任意重寫後處理規則,而之前處理SetEnvIf

現在我可以使用%{ENV:APP_DIR}在改寫條件下訪問APP_DIR,第二部分是任何重寫規則。

我需要實現的是比這更復雜一點,因爲應用程序目錄不存在,而是讓PHP應用程序知道作爲後端而不是前端進行處理的重定向,例如目前重寫(不ENV VAR)是

### ADMIN REWRITE 
RewriteRule ^application\/?$ index.php?mode=administration&%{QUERY_STRING} [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^application(\/(.*\/?))?$ index.php?page=$1&mode=administration&%{QUERY_STRING} [NC,L] 

### FRONTEND REWRITE - Will ignore files and folders 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*\/?)$ index.php?page=$1&%{QUERY_STRING} [L] 

所以,你很可能會看到,我需要能夠替代applicationAPP_DIR,讓系統管理員更改路徑,所以它可能是cmsadmin等。

不幸的是,以下納克將不起作用

### ADMIN REWRITE 
RewriteRule ^%{ENV:APP_DIR}\/?$ index.php?mode=administration&%{QUERY_STRING} [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^%{ENV:APP_DIR}(\/(.*\/?))?$ index.php?page=$1&mode=administration&%{QUERY_STRING} [NC,L] 

### FRONTEND REWRITE - Will ignore files and folders 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*\/?)$ index.php?page=$1&%{QUERY_STRING} [L] 

%{ENV:APP_DIR}不能在重寫的正則表達式中使用,作爲正則表達式是任何重寫之前被處理,並且將env瓦爾。

有沒有人達到我所需要的?即使這意味着在某種程度上調整重寫邏輯,它可以完成嗎?我必須說明重寫後的PHP邏輯不能改變,因爲如果是現有的系統,它會有向後兼容性問題。

回答

1

使用RewriteCond與環境變量到第一個斜槓(/)匹配%{REQUEST_URI},然後用^[^/]*/啓動RewriteRule正則表達式。如果你不處理子目錄,這將工作;否則,您必須放棄RewriteRule正則表達式中的確定起點。

+0

你知不知道,這仍然困擾着我,而我從未從這個角度想過它。 – designermonkey 2013-08-05 09:49:14