2011-09-07 30 views
11

我想知道是否可以根據.htaccess文件中的虛擬主機URL設置條件http基本認證要求。.htaccess通過虛擬主機進行基本認證?

例如,我想要做的是讓mysite.com和test.mysite.com在相同的目錄中運行相同的代碼庫,但密碼保護test.mysite.com。它將以這種方式進行設置,這樣我就不需要分支我的代碼,因爲我的應用程序代碼可以查看它從哪個vhost/url提供服務並選擇數據庫來提供內容。

回答

19

您可以通過使用mod_setenvif以及mod_auth模塊來分類kludge。使用SetEnvIfNoCase指令來設置哪個主機受密碼保護。你需要一對額外的指令,以滿足訪問:

# Check for the hostname here 
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST 

然後Directory塊內(或只是在公開出來),你有你的權威性的東西設置,這樣的事情:

AuthUserFile /var/www/test.mysite.com/htpasswd 
AuthType Basic 
AuthName "Password Protected" 

現在的要求/滿足的東西:

Order Deny,Allow 
Satisfy any 
Deny from all 
Require valid-user 
Allow from env=!PROTECTED_HOST 

這將讓這個不匹配^test\.mysite\.com\.?(:80)?$會有而不需要身份驗證訪問的任何主機(Allow from env=!PROTECTED_HOST),但除此之外,我們需要一個有效的用戶(Require valid-user)。 Satisfy any確保我們只需要其中的一個,無論是允許還是要求。

+0

我想有一個條件案件激活,但使用來測試它,但它不起作用。有任何想法嗎? ..我正在使用:SetEnvIfNoCase主機「dev.example.com」DEV ...然後爲'dev'情況和爲'常規'網站... – DM8

+0

@ DM8這不是什麼[](http://httpd.apache.org/docs/2.2/mod/core.html#ifdefine)。這些變量由'-D'命令行標誌設置。它們不是環境變量。 –

+0

嗯,然後除了等待我的主機升級到Apache 2.4(其中有塊...)。有什麼方法可以獲得我期待的行爲嗎? ...在我的搜索中,我找到了以下文章,這似乎表明在Apache 2.2x中沒有這樣做的方法:http://turboflash.wordpress。com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and -rewriterule-directives/ – DM8

5

這裏是類似於喬恩·林提出了一個解決方案,但使用RewriteCond檢查主機名:

RewriteEngine On 
RewriteCond %{HTTP_HOST} =protected.hostname.com 
RewriteRule ^.*$ - [E=DENY:1] 

AuthUserFile /path/to/htpasswd 
AuthName "Password please" 
AuthType Basic 

Order Deny,Allow 
Satisfy any 
Deny from all 
Require valid-user 
Allow from env=!DENY 
12

我不得不實施喬恩的解決方案問題: 雖然我很熟悉Apache的conf和正則表達式,認證總是被觸發。從快速分析它看上去像Allow from env=!PROTECTED_HOST線沒有踢

但我發現了另一個解決方案,實際上看起來更安全的對我說:。

我創建了兩個虛擬主機爲指向同一個文檔根目錄的兩個域(這是完全允許的方式)。在其中一個虛擬主機中,我添加了基本身份驗證指令(直接進入vhost指令塊)。

工程就像一個魅力。而且我有一種更好的感覺,這是非常安全的 - 沒有任何風險可以忽略任何可能爲入侵者打開大門的正則表達式細節。

<VirtualHost *:80> 
    ServerName www.mysite.com 
    DocumentRoot "/path/to/common/doc/root" 

    <Directory "/path/to/common/doc/root"> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Order allow,deny 
     Allow from all 
    </Directory> 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName protected.mysite.com 
    DocumentRoot "/path/to/common/doc/root" 

    <Directory "/path/to/common/doc/root"> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Order allow,deny 
     Allow from all 

     AuthUserFile /path/to/htpasswd 
     AuthName "Password please" 
     AuthType Basic 
     Require valid-user 
    </Directory> 
</VirtualHost> 
+2

這是**正確**的方式來做到這一點。如果需要2個虛擬主機進行不同的配置,則需要配置2個虛擬主機。使用env var和''any''的黑客解決方案應該只適用於託管不允許訪問vhost/server config的情況,並且您只剩下一個.htaccess解決方案。 –