在基本身份验证之前强制HTTPS重定向循环

时间:2016-02-11 21:07:50

标签: php apache .htaccess mod-rewrite

我正在尝试,因为互联网上的许多人已成功完成,在我的网站上强制使用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,并且在您进行身份验证后重定向仍然有效。我做错了什么?

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]