首先:一个简单的端口80 – >端口443重写不会解决这个问题。 在几乎每一个以前的问题,邮件线程,论坛线程等,我都发现这是第一个无知的反应,并被多次parrot。
其次:是的,我知道你不能在同一端口上提供HTTP和HTTPSstream量。 这不是那个。
通过端口倍增托pipe多个站点的Apache服务器。 80号港口是公共场所。 端口443提供该网站的安全版本。
端口7443,8443和9443分别服务于不同的SSL安全站点。
如果用户错误input了URL,或者input了一个无效的链接,比如说http://hostname.tld:7443 ,那么这个页面会出现下面这个荒谬的页面:

而不是服务器只是redirect到https://hostname.tld:7443 。
我的问题是,如何在Zeus的butthole的名义,你可以修改Apache的行为或这个错误消息来redirect用户自动?
即使configuration为HTTPS,Apache显然也会提供非https请求(显示该错误消息)。 对我来说,似乎非常愚蠢的做法是不要默认redirect,但是我可以理解为什么他们按照自己的行为行事,即使我不同意。 所以我的问题是:你能改变它吗? 他们正在处理错误SOMEWHERE,而Apache是configuration聚宝盆,这是有原因的,有一些指令的地方来处理这种行为,但我已经无法find它在几个小时的修补到目前为止。
我尝试了各种各样的东西,包括:
使用ErrorDocument 400指令来获得一个CGI和一个PHP脚本,它只是发送Status 301和Location标题。 这导致一个空白页面。 使用ErrorDocument 400 https://hostname.tld:7443只会导致在页面上显示该链接。
使用几乎所有的mod_rewrite我或谷歌的组合可以拿出来,包括全部指导网站的一揽子声明; 这些都不起作用。 从字面上看,他们什么都不做。 我猜测Apache甚至在尝试处理重写指令之前,都在踢上述错误。
由于自定义端口的使用,我无法使用基于端口的redirect。 我无法使用基于脚本的redirect,因为他们从来没有得到服务,因为http / https不匹配。 我几乎愿意把这个问题归咎于一个错误,或者是一个意想不到的行为,但是有人曾经有过这样一个想法:把一个非常自定义的错误信息放在那里,他们没有想到,也许你只是想购买他们已经提供的 URL?
我认为这可能是Apache 2.2和更低版本处理这个特定情况的一个错误。
看来在SSL读取400 Bad Request错误,Apache 2.2不返回HTTP响应代码或头,只有HTTP响应正文。 我通过Telnet到端口443进行testing并发送:
GET / HTTP/1.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 /> <blockquote>Hint: <a href="https://server.tld/"><b>https://server.tld/</b></a></blockquote></p> </body></html>
请注意缺lessHTTP响应代码或任何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>
如果我像你一样设置一个ErrorDocument行:
ErrorDocument 400 https://server.tld/
然后我得到一个302redirect的HTML,但再次,没有头。 没有302redirect响应代码和Location:头,浏览器将不会redirect。
尝试升级到Apache 2.4,看看它是否工作。 我已经testing并至less用Apache 2.4.3进行了确认,但是我还没有经过努力来确定何时这是行为更新。 我怀疑,他们在准备2.4的大量工作中,纠正了不良行为的副作用。
相关的Apache httpd错误:
UPDATE
你可以强制一个错误的Apache给你你想要的行为(redirect),让脚本打印出它的头文件(不会被发送到客户端),然后再手动打印出你想要的头文件。 这里有一个基本的Perl脚本,可以在Apache 2.2.22下运行:
#!/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
您应该意识到,除了仅与没有SSL的SSL端口通话外,还有其他原因可能会生成400。 确定这一点的简单方法是查找HTTPS环境variables。 如果它被设置,那么SSL被正确地协商,而其他的则导致了400(如果是这样的话,不要做双头诡计)。 如果未设置HTTPS ,请返回您的redirect,如上所述。
你可以用mod-rewrite来解决这个问题。 设置一个规则来匹配任何东西。 在Stackoverflow上看到这个答案