2012-05-22 75 views
19

TL;博士:我怎麼做一個的.conf或.htaccess文件如下:在Apache配置中檢測Apache版本?

<IfApache22> 
    # Do A 
</IfApache22> 
<IfApache24> 
    # Do B 
</IfApache24> 

較長的問題:

與Apache 2.4的老Order獲取的贊成不贊成Require

在我的.htaccess文件我有

<FilesMatch "\.(long|list|file|types)$"> 
    Order allow,deny 
</FilesMatch> 

這意味着阿帕奇無法啓動,除非我能access_compat。雖然這樣做提供了一個有用的解決方法,但我需要一種可以同時處理這兩種語法的解決方案,因爲配置將分發到許多服務器。問題是我如何檢測當前版本的Apache並應用正確的指令。

我打算將該文件用於分發給許多人使用的框架,並且我無法控制/保證他們有或沒有任何特定的服務器設置,這就是爲什麼我想要該文件爲2.2/2.4「不可知」。

回答

2

您可以運行在同一臺主機上不同版本的Apache。問:單獨目錄中的單獨配置文件有什麼問題?老實說,我相信這可能是最乾淨的方法...

不過,Apache的conf文件允許<IfDefine>,您可以在運行時用「-D」規定:

http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

+1

+1的IfDefine和-D選項。但它並沒有真正幫助我。當一個簡單的if/else應該能夠解決這個問題時,運行兩個版本的web服務器似乎就像很多工作一樣。你能擴展「分開的目錄」嗎?檢查當前版本對我來說似乎是一個非常好的解決方案。爲什麼擴大了這個問題。 – Letharion

27

一個黑客,我用過的。

# Apache 2.2 
<IfModule !mod_authz_core.c> 
    Satisfy Any 
</IfModule> 

# Apache 2.4 
<IfModule mod_authz_core.c> 
    Require all granted 
</IfModule> 
+1

......或者如果該模塊兩端缺席,但你的本地/臺服務器是贏(和Apache 2.x的),你的生活是Linux(和Apache 2.Y),檢查任何其他模塊的差異,即'' –

+0

夢幻般的答案。一切似乎建立爲2.4,但我的是2.2,這允許向前兼容性! – Keith

1

你可以繞過需要通過使用mod_rewrite爲您的訪問控制要知道:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$ 
RewriteRule .* - [F,L] 
14

假設你有mod_version安裝(許多發行版默認出貨),你可以做到以下幾點:

<IfVersion >= 2.4> 
    # Require ... 
</IfVersion> 
<IfVersion < 2.4> 
    # Order ... 
    # Deny ... 
    # Allow ... 
</IfVersion> 
+3

我推薦這個答案。如果你能夠承擔額外的依賴性,這種方法更清晰。另外,如果在接受的答案中使用該方法時,mod_authz_core被禁用,則配置文件將假定它在2.2上運行並繼續。在這裏刪除mod_version只會意味着服務器將拒絕啓動。 – seanhodges

1

我遇到了這個問題,因爲FallbackResource不在Apache的早期版本中,並且經常聰明的託管公司在他們擁有版本A後刪除mod_rewrite與FallbackResource一起使用。我用下面的.htaccess當我想要把庫代碼了,能夠適應其環境:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule^- [E=protossl] 
    RewriteCond %{HTTPS} on 
    RewriteRule^- [E=protossl:s] 
    RewriteRule "(^|/)\." - [F] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !=/favicon.ico 
    RewriteRule^index.php [L] 
</IfModule> 

<IfModule !mod_rewrite.c> 
    FallbackResource index.php 
</IfModule> 

當然現在也有一些版本的Apache /菜單時,如果失敗 - 但如果mod_rewrite的是存在的,使用它,如果沒有,希望FallbackResource在那裏。