我正在尝试,因为互联网上的许多人已成功完成,在我的网站上强制使用HTTPS,但之前出现基本身份验证对话窗口。我尝试了两种主要的方法,包括“FilesMatch”解决方案和“ErrorDocument”解决方案。前者导致内部服务器错误,后者导致重定向循环问题。这是我到目前为止(试图使错误文档解决方案工作):
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
SSLRequireSSL
ErrorDocument 403 https://website.com/private/https.php
AuthType Basic
AuthName "Password Protected Area"
AuthUserFile /srv/users/serverpilot/apps/intranet/public/.htpasswd
Require valid-user
https.php文件只是:
<?php
header("LOCATION: /");
exit();
我的服务器正在运行Apache 2.2,并且在您进行身份验证后重定向仍然有效。我做错了什么?
答案 0 :(得分:3)
您的http重定向应该在端口80虚拟主机上设置,而您的身份验证配置只应添加到您的443端口虚拟主机。
例如:
<VirtualHost *:80>
ServerName www.server.com
DocumentRoot /var/www/site
<Directory /var/www/site>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName www.server.com
DocumentRoot /var/www/site
<Directory /var/www/site>
Options FollowSymLinks MultiViews
AllowOverride none
Require all granted
</Directory>
<Location />
AuthType Basic
AuthName "Password Protected Area"
AuthUserFile /srv/users/serverpilot/apps/intranet/public/.htpasswd
Require valid-user
</Location>
</VirtualHost>
实际上,考虑过它,因为我们知道要重定向所有端口80(非https)访问,我们可以直接这样做:
<VirtualHost *:80>
ServerName www.server.com
RedirectPermanent / https://www.server.com
</VirtualHost>
然后只需使用上面的端口443虚拟主机。
要仅使用.htaccess设置来实现类似的功能:
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "www.server.com"
AuthType Basic
AuthName "Password Protected Area"
AuthUserFile /var/www/site/.htpasswd
Require valid-user
ErrorDocument 403 https://www.server.com/
ErrorDocument 404 https://www.server.com/
这样做的主要缺点是,您将始终被重定向到主页(或ErrorDocument指令指向的任何位置)。 Apache网站提到(参见here)你可以使用脚本作为你的ErrorDocument并且它传递了原始的请求URI,尽管当我在Apache 2.4上尝试这个时它似乎没有那样工作。 / p>
此外,VirtualHost主配置中的任何设置都可能会破坏此方法。不幸的是,与主服务器配置相比,.htaccess非常受限制。
我可以建议的另一件事是,如果您不需要保护整个站点,您可以在子目录中的另一个.htaccess文件中设置授权指令。
查看this site以获取有关使用.htaccess文件的一些非常好的信息
答案 1 :(得分:0)
我不知道你是否已经解决了这个问题,或者这是否有帮助,但以下是我在开发机器上使用的内容,以确保在我正在使用的整个网站中使用https。
这两行位于站点根级别的.htaccess
中 - 主httpd.conf
中的配置要复杂得多,但只是为管理区域内的ssl设置了特定选项,并且没有不会影响非管理区域,所以我知道这是有效的(是否适合你,我不能说)
在我取消basic authentication
之后,管理区域目前使用了digest auth
,尽管这一切都正常。
我不像上面那样使用错误文档来重定向,因为下面的行确保https - 希望它有所帮助!
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [R,L]