2012-02-09 64 views
2

我無法得到它的這部分.htaccess,IfDefine永遠不會運行。我在做什麼錯,setenvif mod已啓用。SetEnvIf HTTP_HOST不能正常工作

RewriteBase/

SetEnvIf HTTP_HOST ^localhost$ local 
<IfDefine local> 
    RewriteBase /codeigniter-app/ 
</IfDefine> 

SetEnvIf HTTP_HOST ^testing.alex.com$ testing 
<IfDefine testing> 
    RewriteBase /app/ 
</IfDefine> 

這是基於:With mod_rewrite can I specify a RewriteBase within a RewriteCond?

編輯: 任何其他方式來完成上述?

回答

3

我的答案是,如果Apache不允許你在這裏做你想做的事情,但那是因爲AFAIK你不需要這樣做來做真正的需要做的事情。

看起來好像您正在嘗試創建一個本地環境,該環境在配置方面反映您的(遠程)基於服務器的測試環境。然而,你正在混淆URI名稱空間和文件系統名稱空間,而在Apache服務器中這些完全不同。例如<Location>指令對前者進行操作,<Directory>指令對後者進行操作。 .htaccess這兩種方法都是相同的,因此您需要了解某個參數何時在其中一個參數上運行。

例如,我有一個服務多個子域*.ellisons.org.uk的共享服務帳戶 - 例如我的博客位於http://blog.ellisons.org.uk/。我在Ubuntu筆記本電腦和虛擬機上開發了一個虛擬機,該虛擬機鏡像了我的服務提供商運行的LAMP/suPHP配置(但我擁有root訪問權並可以在VM上看到重寫日誌等),我在我的192.168.1.0/24私有地址中靜態分配IP地址比這個URI空間空間,並有/etc/hosts symonyms爲

127.0.1.1  ... blog.ellisons.org.home forum.ellisons.org.home ... 
192.168.1.250 ... blog.ellisons.org.vm ... 

但是其他的是相同的,從我的服務器,筆記本電腦或VM所以blog.ellisons.org.XX/themes/terry/all.css負荷我的CSS取決於是否XX =英國,家庭,VM

然而我的筆記本電腦上的文檔根目錄是Debian標準/var/www,但另外兩個是/websites/LinuxPackage02/el/li/so/ellisons.org.uk/public_html(我的主機命名約定)。然而,我的應用程序包括.htaccess文件是相同的,並且這些反映了這種多次使用的唯一方式是在正則表達式中,我使用它作爲正則表達式來匹配%{HTTP_HOST} (\w+)\.ellisons.\org\.(?:uk|home|vm)

所以你的例子:

  • 沒有什麼阻止你指向你的本地計算機上的請求/app到你的物理目錄/codeigniter-app。您可以在您的服務器或vhost配置中使用Alias指令來執行此操作。
  • RewriteBase將採用URI路徑參數,因此/app可以同時工作。
  • Apache一般理解URI和FS域之間的區別,不會感到困惑 - 即使您的開發人員經常這樣做:-)在極少數情況下,您需要明確提及FS名稱,比如RewriteCond字符串,您可以使用%{DOCUMENT_ROOT} - 但如果您的服務是共享服務,則可能需要使用環境變量(我的是%{ENV:DOCUMENT_ROOT_REAL})。我phpinfo()會告訴你哪個。
  • 確保您使用任何RewriteRule替換(不包括前導斜槓)中的相對地址。

所以總結一下,有思想的一點點,你可以讓你的配置邏輯相同像Apache提供 - 是不是比試圖在這是從來沒有設計到商品的方式,條件執行,以更好地彆彆扭扭?

+0

localhost,測試站點(不同主機)和活動站點(rewritebase:/)。所以apache別名不起作用。如果你的建議是這樣的:http://stackoverflow.com/questions/2434820/many-rewritebase-in-one-htaccess-file請建議我將它應用到我的codeigniter .htaccess https://gist.github。 com/d11be61ebca9bc49daab – Alex 2012-02-09 23:22:28

+0

+1爲您的廣泛的信息,我要試試這個:http://serverfault.com/questions/53145/mod-rewrite-and-multiple-rewritebases – Alex 2012-02-09 23:43:34

+0

「本地主機,測試網站(不同的主機)和活網站(rewritebase:/)「。我假設你有root用戶訪問本地主機和測試站點的權限,所以你在他們的虛擬主機中使用別名,以便所有3的URI(位置層次結構)都是相同的,那麼你不需要有不同的重寫基地。這就是我所做的,我的實時配置與本地主機不同。 – TerryE 2012-02-10 10:08:35

4

SetEnvIf設置一個環境變量。它沒有爲Apache使用定義新的常量。

請參閱SetEnvIf manual並將其與<IfDefine> manual進行比較。

+0

這是我讀到這樣做:http://stackoverflow.com/questions/2045897/with-mod-rewrite-can-i-specify-a-rewritebase-within-a-rewritecond – Alex 2012-02-09 14:18:27

+1

能你建議我的問題的任何可能的修復/解決方案? – Alex 2012-02-09 14:45:05

7

SetEnvIf適用於請求標頭。所以你想使用HOST而不是HTTP_HOST。例如。

SetEnvIf HOST ^localhost$ local 
+0

我會試一試 – Alex 2012-02-29 22:52:40