.htaccess虚拟主机的基本身份验证?

use*_*925 11 apache .htaccess basic-authentication .htpasswd

我想知道是否可以根据.htaccess文件中的虚拟主机URL设置条件http基本身份验证要求.

例如,我想要做的是让mysite.com和test.mysite.com在同一目录中运行相同的代码库,但密码保护test.mysite.com.它将以这种方式设置,以便我不需要分支我的代码,因为我的应用程序代码可以看到它从哪个vhost/url服务并选择数据库来提供内容.

Jon*_*Lin 19

您可以通过mod_setenvifmod_auth模块一起使用来解决这个问题.使用该SetEnvIfNoCase指令设置哪个主机受密码保护.您需要一些额外的指令来满足访问:

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

然后在Directory块内(或刚刚打开)你有你的auth设置,如下所示:

AuthUserFile /var/www/test.mysite.com/htpasswd
AuthType Basic
AuthName "Password Protected"
Run Code Online (Sandbox Code Playgroud)

现在需要/满足的东西:

Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=!PROTECTED_HOST
Run Code Online (Sandbox Code Playgroud)

这将使得任何不匹配的主机^test\.mysite\.com\.?(:80)?$都可以访问而不需要auth(Allow from env=!PROTECTED_HOST),但是否则,我们需要一个有效的user(Require valid-user).的Satisfy any,我们只需要2的一个保证,无论是允许或要求.


Jps*_*psy 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>
Run Code Online (Sandbox Code Playgroud)

  • 这是**正确的**方式.如果需要以不同方式配置2个vhost,则配置2个vhost.env var和`satisf any`的hacky解决方案应该只在你托管的时候才能应用,不能让你访问vhost/server配置,并且你留下了.htaccess解决方案. (2认同)

Mic*_*ski 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
Run Code Online (Sandbox Code Playgroud)