如何在目录上强制HTTPS并强制进行HTTPS身份验证

时间:2010-12-22 22:21:40

标签: .htaccess apache

我想知道强制进行HTTPS身份验证的最佳方法是什么。

当我在.htaccess文件中有这个时:

AuthType Basic
AuthName "Developer"
AuthUserFile /usr/local/etc/apache22/passwords/passwords
Require user david

身份验证有效,但它通过端口80进行身份验证,并以明文形式发送密码。

所以我想我会添加一个重定向规则来将所有非HTTPS请求重定向到等效的HTTPS请求:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteBase /~david/
RewriteRule ^(.*)$ https://myserver.tld/~david/$1 [R,L]

这也有效,但它首先在端口80上进行身份验证,然后重定向,然后在端口443上再次进行身份验证。我不想在端口80上进行身份验证,因为密码将以明文形式发送。我无法找到一种立即重定向到HTTPS的好方法,然后再进行身份验证。

我能想出如何做到这一点的唯一方法就是这样做:

AuthType Basic
AuthName "Developer"
AuthUserFile /usr/local/etc/apache22/passwords/passwords
Require user david
ErrorDocument 403 /403.php
SSLRequireSSL

在我的服务器上有一个403.php的PHP脚本:

<?php

header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

?>

这是所需的行为。它需要SSL,因此当您尝试访问端口80上的目录时,它会吐出一个自定义错误文档,并将该文档重定向到HTTPS。

这看起来像是一块垃圾。有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:13)

因此,您遇到的问题是您的或块现在适用于HTTPS和HTTP情况。你需要解开这个问题(实际上 - 你也可以使用'满足任何' - 但在这种情况下这有点麻烦。)

易于调试/理解的方法是转到如下结构:

<VirtualHost *:80>
   ...
   RewriteRule ^/foo/bar/?(.*)$ https://myserver.tld/foo/bar/$1 [R,L]
   # and to guard against typo's...
   <Directory /foo/bar/>
       deny from all
   </Directory>
</VirtualHost>


<VirtualHost *:443>
   ...
   <Directory /foo/bar/>
       BasicAuth .. etc.
       allow from all
   </Directory>
</VirtualHost>

从那里拿东西。

DW传递。