我想知道是否可以根据.htaccess文件中的虚拟主机URL设置条件http基本身份验证要求。
例如,我想要做的是让mysite.com和test.mysite.com在相同的目录中运行相同的代码库,但密码保护test.mysite.com。它将以这种方式设置,以便我不需要分支我的代码,因为我的应用程序代码可以看到它从哪个vhost / url服务并选择数据库来提供内容。
答案 0 :(得分:19)
您可以使用mod_setenvif
和mod_auth
模块来解决这个问题。使用SetEnvIfNoCase
指令设置受密码保护的主机。您需要一些额外的指令来满足访问:
# Check for the hostname here
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST
然后在Directory
区域内(或者只是在公开区域内)你有你的auth设置,如下所示:
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
确保我们只需要其中一个,即Allow或Require。
答案 1 :(得分:12)
我在实施Jon的解决方案时遇到了问题:
虽然我对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 :(得分:5)
这是一个类似于Jon Lin提出的解决方案,但使用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