Apache 重定向到 https 以进行基本身份验证

Apache 重定向到 https 以进行基本身份验证

我对一个老问题有了更棘手的改进。

我有一个基于 apache 的站点,通常应该通过 http/port 80 访问。但是对于需要身份验证的某些受保护区域(由 .htaccess 指定),我希望能够将用户重定向到 https/port 443。

这里的关键是我希望这始终发生在基本身份验证中 - 即我不想使用重定向指令重新创建每个 htaccess 文件。我只想强制执行基本身份验证(其他流量应未加密)。受保护区域分散在整个站点。是否可以以某种方式将所有基本身份验证请求重定向到 SSL 主机?

答案1

我认为不可能自动将使用基本身份验证的 HTTP 请求重定向到某个位置 - 至少不能单独使用 Apache httpd。

但您可以使用SSLRequireSSL指令内部地点阻止强制客户端使用 HTTPS,否则他们将收到错误 403。

答案2

我最终弄清楚了在我们的一台服务器上是如何实现这一点的(Ugly Hack 警报)。

我们基本上不允许在非 SSL(端口 80)主机的节中使用 .htaccess 文件。当遇到 .htaccess 文件时,会产生 500 错误。

我们将所有 500 错误重定向到允许 .htaccess 文件的 SSL 主机。“真正的”500 错误消息可能也会在 SSL 端失败,而 .htaccess 相关的重定向现在在启用 SSL 的端可以正常工作。

是的,非常丑陋。我不想复制这个,但我想我会把它传递下去。

答案3

在使用 Basic Auth 访问的目录中的 .htaccess 文件中,输入以下内容:

SSLRequireSSL
ErrorDocument 403 /erreurs/403.php
ErrorDocument 401 /erreurs/401.php

这会将使用 http 的访问者重定向到 401 或 403 错误页面。

在这些页面中,输入以下内容:

<?php
$path = $SERVER['REQUEST_URI'];
if($_SERVER["HTTPS"] != "on")
{
header('HTTP/1.1 301 Moved Permanently');
header('Status: 301 Moved Permanently');
header('Cache-Control: max-age=31536000');
header('Content-Language: en');
header('Location: https://www.example.com/'.$path.'');
echo '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><title>301 Moved Permanently</title></head><body><h1>Moved Permanently</h1><p>The document has moved <a href="'.$path.'">here</a></p></body></html>';
}
else {
echo '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><title>Forbidden</title></head><body><h1>Forbidden</h1><p>Forbidden</p></body></html>';
} ?>

基本身份验证将重定向到 HTTPS。

相关内容