我有一个带有多个虚拟主机的 Web 服务器。其中一些主机有一个关联的 SSL 站点。我的主要配置文件中有一个 DirectoryMatch 指令,它要求对任何目录进行基本身份验证担保作为目录路径的一部分。在具有 SSL 站点的站点上,我有一个重写规则(位于该站点的非 SSL 配置中),该规则重定向到 SSL 站点,相同的 uri。
问题是 http (80) 站点首先要求提供凭据,然后 https (443) 站点再次要求提供凭据。我想阻止 http 站点询问,从而避免有人输入凭据并以明文形式发送。我知道我可以将 DirectoryMatch 移至特定站点,然后将 auth 语句放在 SSL 配置中,但这可能会导致在创建新站点时忘记保护关键目录。
以下是相关声明:httpd.conf(所有站点):
<DirectoryMatch "_secured_">
AuthType Basic
AuthName "+ + + Restrcted Area on Server + + +"
AuthUserFile /home/websvr/.auth/std.auth
Require valid-user
</DirectoryMatch>
site.conf(特定于单个站点)
<DirectoryMatch "_secured_">
RewriteEngine On
RewriteRule .*(_secured_.*) https://site.com/$1
</DirectoryMatch>
有没有办法将 DirectoryMatch 留在主配置文件中并阻止来自 http 站点的授权请求?
在 Ubuntu 10.04 服务器中从默认软件包运行 Apache 2。我将 AllowOverride 设置为 none - 我更喜欢在配置文件中处理事情,而不是 .htaccess。
答案1
您必须在身份验证请求之前进行重写。
您的其他重写规则是什么样的?如果它们都与示例相同,您可以将它们移至主 DirectoryMatch。编写检查以查看站点是否为 SSL。如果不是,则重定向。
然后就会进行身份验证。类似这样的:
<DirectoryMatch "_secured_">
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*(_secured_.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
AuthType Basic
AuthName "+ + + Restrcted Area on Server + + +"
AuthUserFile /home/websvr/.auth/std.auth
Require valid-user
</DirectoryMatch>