我想让我的 apache2 webserver 在同一个端口上同时提供 http 和 https 服务。
我尝试了不同的方法,但结果要么在 http 上不起作用,要么在 https 上不起作用。
我怎样才能做到这一点?
更新:
如果我启用 SSL,然后使用 http 访问,我得到如下页面:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://server/"><b>https://server/</b></a></blockquote></p>
<hr>
<address>Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny16 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g Server at server Port 443</address>
</body></html>
因此,在同一端口上同时使用 http 和 https 似乎非常有可能。
第一步是更改此默认页面,使其显示 301-Moved 标头。
更新2: 根据这,这是可能的。现在的问题是如何配置 apache 来实现这一点。
答案1
SSL 流量无法在与非 SSL 流量相同的端口上工作,TLS 可以做到这一点,但它不用于 Web 服务器上,TLS 最常用于 SMTP 服务器正是因为这个原因
同样的问题已经被不同的人问过好几次了(见下面的两个例子),而且总是说,单独使用 Apache 是不可能的,你必须使用其他软件或创建某种自己的监听器:
Apache2 在端口 5553 上将 http 重写为 https
另外,我找不到任何官方 Apache 文档提及在同一端口上进行 http 和 https 流量而无需进行重定向。
请记住,当人们说 SSL 时,他们通常指的是 SSL/TLS,但它们并不相同。
我认为 apache.org 上的这个答案对于你在同一端口上使用 http 和 https 的问题肯定是“否”
Can we have both http and https listening on the same port?
Comment 1 Eric Covener 2011-11-22 14:36:45 UTC
No, and bugzilla is not for support or Q&A. Try the users mailing list.
https://issues.apache.org/bugzilla/show_bug.cgi?id=52228
您可以尝试mod_rewrite 模块但我建议您再开一个问题,了解如何使用它进行 https 重定向(您仍然需要多个端口)。我没有用过它,所以无法向您提供有关如何操作的详细信息。
就像我说的,我对这个模块不太了解,所以我猜你需要三个端口。一个非 SSL 端口用于 mod_rewrite 监听,一个非 SSL 端口用于 http 流量,一个 SSL 端口用于 https,你必须为 mod_rewrite 设置 999 端口,然后让你的服务监听两个不同的 http 和 https 端口。
请注意 Shane Madden 在他的评论中所说的内容,即使您将 mod_rewrite 放在该端口上,启用 SSL 的端口上的 http 请求也只会给您错误。
答案2
可以使用自定义 ErrorDocument 将 http 重定向到 https。
不过,在当前版本的 Apache 中,无法让整个 Web 服务器同时在 http 和 https 上运行。
遗憾的是,Apache 2.2-16 中有一个错误尚未修复,因此重定向仅在 Apache 2.4 中有效。
欲了解更多信息,请参见此处:https://issues.apache.org/bugzilla/show_bug.cgi?id=50823
更新
下面是我使用 apache 2.4 测试的概念验证片段:
<?php
if ($_SERVER["REDIRECT_STATUS"] == "400" && preg_match("/.*?Reason: You're speaking plain HTTP to an SSL-enabled server port\..*/", $_SERVER["REDIRECT_ERROR_NOTES"])) {
header("Location: https://localhost:999");
} else {
//echo normal error message
}
?>
通过在您的 apache 配置文件中设置来使用它ErrorDocument 400 /redirect-400-error.php
。您可以在自定义 ErrorDocuments 的实现中找到更多信息这里。
答案3
简单的解决方案:
ErrorDocument 400 https://server:port/
现在您会得到“找到”重定向,并且没有任何令人讨厌的错误消息。
答案4
我认为它可以通过定义静态 ErrorDocument 来工作,例如:
错误文档 400 /redirect_https.txt
redirect_https.txt
然后在文档根目录中创建包含以下内容的文件:
HTTP/1.1 302 Found
Location: https://www.example.com/mypage.html
这有效(甚至尝试过)并向浏览器发送“伪造的”HTTP 重定向。