2011-07-20 35 views
12

我正在研究一個使用url重寫並具有特定.htaccess配置的應用程序。在此應用時,我有三個eviorments:。開發,暫存和生產之間的htaccess

  1. Developent我的本地機器(本地主機)
  2. 分期(staging.mydomain.com)
  3. 生產(www.mydomain.com)

我不斷推動對升級和生產環境的新升級,並且每次覆蓋現有的源代碼時,我都必須更改.htaccess文件。有沒有辦法使.htaccess通用於目錄或讓它自動檢測它的環境?

我目前的.htaccess文件如下。我只是不評論不同環境之間的部分,但願意停止這樣做...

# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

在此先感謝!

+0

爲什麼路徑不同,但/ favicon.ico是相同的? –

+2

我只需設置虛擬主機,以便在每個環境中都有相同的URL。那麼你不需要改變它們之間的.htaccess。 – Quentin

回答

13
# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^localhost 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^staging.mydomain.com 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^www.mydomain.com 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 
+0

'%{REQUEST_HOST}'過期變量?我只在mod_rewrite文檔中找到等價的'%{HTTP_HOST}'。 –

+0

@JohnnyWong,似乎是這樣的:https://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond 用'HTTP_HOST' var更新了答案。 如果您發現任何其他問題,請隨時編輯答案,因爲我自2011年以來不使用apache;) –

7

一種選擇是,設置環境變量在httpd.conf(或其他地方),定義您的環境。

例如(在httpd.conf):

SetEnv ENVIRONMENT production 

(在.htaccess

RewriteEngine on 

# Development 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = development 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = staging 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = production 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

未經檢驗的,但我認爲這個概念是不夠健全找出任何問題;-)

+0

+1如果您有權訪問Apache conf,因爲您可以設置環境而不考慮網址是。進行本地開發,您可以更容易地使用不同的URL來託管服務器 – Precastic

0

查克D,Dumitru Ceban的變種非常好。但我建議你也嘗試在你的代碼中加入一些標誌 - 而不是在.htacces中。

另外,rudi_visser的好建議。但我想補充一點,在理想的系統中,我們只應該使用apache的* .conf並拒絕.htaccess(只是一個愚蠢的表現)。

所以我建議你在代碼中有一些標誌,避免.htacess(如果可以)和切換env。通過簡單的conf值或通過一些邏輯,如if locaslhost == host then ...

+0

或者對於理想的系統,我們只能使用 - *。conf生產。 – gaRex

+0

我不認爲現代系統上的.htaccess的性能是任何需要擔心的事情!但無論如何,我不認爲把這個邏輯放到代碼中會有助於這種情況,因爲Apache無論如何都不知道在哪裏發送請求。 –

+0

@rudi_visser,不確定,.htaccess在生產中是否足夠。 PHP可以知道在哪裏傳遞你的框架內的邏輯:使用tmp/pathes的哪個數據庫連接。 – gaRex

1

你不能只在每個環境中放置你的.htaccess文件,然後在你使用的任何FTP或部署程序中忽略該文件?

另外,我所做的是在我的本地主機中設置VirtualHosts,該域與生產站點位於同一域,但前綴爲dev.。例如,www.example.comdev.example.com。這樣,無論環境如何,我總能確定根目錄是我使用的任何主機的頂層目錄;我不需要重寫我的.htaccess指令。

相關問題