pee*_*man 9 http https custom-errors apache-2.2
首先:简单的端口 80 -> 端口 443 重写不会解决这个问题。在几乎所有以前的问题,邮件线程,论坛线程等中,我发现这是第一个无知的回复,并且被重复了好几次。
其次:是的,我知道您不能在同一端口上提供 HTTP 和 HTTPS 流量。 这不是那个。
通过端口倍增托管多个站点的 Apache 服务器。端口 80 服务于公共站点。端口 443 服务于该站点的安全版本。
端口 7443、8443 和 9443 分别为单独的 SSL 安全站点提供服务。
如果用户输入错误的 URL,或者给出的链接无效,比如http://hostname.tld:7443,他们会看到以下荒谬的页面:

而不是服务器只是将它们重定向到https://hostname.tld:7443。
我的问题是,以Zeus 的屁眼的名义,您如何修改 Apache 的行为或此错误消息以自动重定向用户?
Apache 显然是在为非 https 请求提供服务(以显示该错误消息),即使它是为 HTTPS 配置的。对我来说,不只是默认进行重定向似乎非常愚蠢,但我可以理解为什么他们会采用他们所做的行为,即使我不同意。所以我的问题是:你能改变它吗?他们正在某处处理错误,并且 Apache 是配置的聚宝盆,因此有理由在某处处理此行为的指令,但到目前为止,我一直无法在几个小时的修补中找到它。
我尝试了多种方法,包括:
使用ErrorDocument 400指令获取 CGI 和仅发送Status 301和Location标头的 PHP 脚本。这导致空白页。ErrorDocument 400 https://hostname.tld:7443简单地使用会导致该链接显示在页面上。
使用mod_rewriteI 或 Google 能想到的几乎所有组合,包括完全指导网站的一揽子声明;这些永远不会奏效。从字面上看,他们什么都不做。我猜测 Apache 甚至在尝试处理重写指令之前就遇到了上述错误。
由于自定义端口的使用,我无法使用基于端口的重定向。我不能使用基于脚本的重定向,因为它们永远不会因为 http/https 不匹配而得到服务。我几乎愿意将其归结为错误或意外行为,但有人有先见之明地将非常自定义的错误消息放入其中,他们并没有考虑可能您只想将其推到他们已经提供的网址?
我认为这可能是 Apache 2.2 及更低版本如何处理这种特殊情况的一个错误。
似乎在出现 SSL 读取400 Bad Request错误时,Apache 2.2 不返回 HTTP 响应代码或标头,只返回 HTTP 响应正文。我通过远程登录到端口 443 并发送:
GET / HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
服务器立即返回(对我而言):
<!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.tld/"><b>https://server.tld/</b></a></blockquote></p>
</body></html>
Run Code Online (Sandbox Code Playgroud)
请注意缺少 HTTP 响应代码或任何 HTTP 标头。
当我对 Apache 2.4 服务器执行此操作时,我得到:
HTTP/1.1 400 Bad Request
Date: Sun, 10 Feb 2013 00:47:23 GMT
Server: Apache/2.4.3 (Unix) OpenSSL/1.0.0g
Content-Length: 462
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!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 />
</p>
<hr>
<address>Apache/2.4.3 (Unix) OpenSSL/1.0.0g Server at server.tld Port 443</address>
</body></html>
Run Code Online (Sandbox Code Playgroud)
如果我像您一样设置 ErrorDocument 行:
ErrorDocument 400 https://server.tld/
Run Code Online (Sandbox Code Playgroud)
然后我得到了 302 重定向的 HTML,但同样,没有标题。如果没有 302 重定向响应代码和Location:标头,浏览器将不会重定向。
尝试升级到 Apache 2.4,看看它是否有效。我已经至少使用 Apache 2.4.3 进行了测试和确认,但我还没有努力找到确切的行为更新时间。我怀疑在他们准备 2.4 的大量工作中,他们纠正了不良行为作为副作用。
相关的 Apache httpd 错误:
更新
您可以通过让脚本打印出其标头(不会发送到客户端)来强制有缺陷的 Apache 为您提供所需的行为(重定向),然后再次手动打印出您想要的标头。这是一个在 Apache 2.2.22 下工作的基本 Perl 脚本:
#!/usr/bin/perl
use strict;
use CGI;
my $q = CGI->new();
# this will cause Apache to handle the response properly, but is meaningless otherwise
print $q->redirect("https://localhost/");
# this actually performs the redirect
print "HTTP/1.1 302 Found\r\n";
print "Location: https://localhost/\r\n";
print "\r\n";
# you can do whatever you want here; this will be the HTML body
Run Code Online (Sandbox Code Playgroud)
您应该知道,除了仅与没有 SSL 的 SSL 端口通话之外,还有其他原因可能会生成 400。确定这一点的简单方法是查找HTTPS环境变量。如果已设置,则 SSL 已正确协商,并且其他原因导致 400(如果是这种情况,请不要使用双标头技巧)。如果HTTPS未设置,请按上述方式返回您的重定向。
| 归档时间: |
|
| 查看次数: |
11965 次 |
| 最近记录: |