我想知道强制进行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。
这看起来像是一块垃圾。有没有更好的方法来实现这一目标?
答案 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传递。