我有一个Web服务器与几个虚拟主机。 其中一些主机有一个关联的ssl站点。 我在我的主要configuration文件中有一个DirectoryMatch指令,它需要对作为目录path一部分的受保护的任何目录进行基本身份validation。 在具有SSL站点的站点上,我有一个重写规则(位于该站点的非SSLconfiguration中),redirect到SSL站点,同一个URI。
问题是http(80)站点首先要求凭据,然后https(443)站点再次请求凭据。 我想阻止http站点询问,从而避免有人input凭据并以明文forms发送。 我知道我可以将DirectoryMatch移动到特定的站点,只要将auth语句放在SSLconfiguration文件中,但是这会引入在创build新站点时忘记保护关键目录的可能性。
这里是相关的声明: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>
有没有办法在主configuration文件中离开DirectoryMatch并阻止来自http站点的授权请求?
在Ubuntu 10.04服务器上从默认包运行Apache 2。 我有AllowOverride设置为无 – 我喜欢处理configuration文件而不是.htaccess中的东西。
您必须在authentication请求之前进行重写。
你的其他重写规则是什么样的? 如果它们与示例一样,则可以将它们移到主DirectoryMatch中。 写一个检查,看看该网站是否是SSL。 如果不是,redirect。
然后auth会在事后发生。 就像是:
<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>