我在 Apache 中有一个 VirtualHost,它使用带有通配符的 ServerAlias 来匹配许多子域,如下所示:
<VirtualHost>
ServerName foo.com
ServerAlias *.foo.com
</VirtualHost>
有数百个子域与别名匹配,现在我想要针对特定子域的身份验证提示:bar.foo.com
人们该如何去做这样的事呢?
我曾经考虑为创建一个新的VirtualHost bar.foo.com
,但我最好避免这样做,因为一旦我想添加更多这样的域就会变得麻烦。
答案1
取决于您的目录结构(您的VirtualDocumentRoot
目录结构是什么样的?),但对于.htaccess
站点目录中的文件来说,这可能是一个好的情况,如下所示:
AuthType Basic
AuthName "bar.foo.com"
AuthUserFile /var/www/bar.foo.com/.htpasswd
Require valid-user
设置.htpasswd 文件:
htpasswd -c /var/www/bar.foo.com/.htpasswd username1
htpasswd /var/www/bar.foo.com/.htpasswd username2
...
如果可能的话,也加密这些流量。基本身份验证是通过 HTTP 以明文形式发送的,因此使用 SSL 加密是个好主意。
答案2
我遇到了同样的问题,刚刚解决了。
假设您有两个 VirtualHosts“open.example.com”和“resticted.example.com”,它们共享文档根目录“/path/to/your/web-root”。您希望人们能够无需密码访问 open.example.com,但访问 restriced.example.com 则需要密码。那么您的配置将如下所示:
<Directory /path/to/your/web-root>
Order Deny,Allow
Deny From All
SetEnvIf Host open.example.com allowed
Allow from env=allowed
AuthType Basic
AuthName "Won't let you in, if you don't tell me your name and password"
AuthUserFile /etc/apache2/htusers
Require valid-user
Satisfy Any
</Directory>