如何防止 Apache 在非 SSL 站点上要求输入凭据

如何防止 Apache 在非 SSL 站点上要求输入凭据

我有一个带有多个虚拟主机的 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>

相关内容