AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 477236
Accepted
peelman
peelman
Asked: 2013-02-10 14:09:08 +0800 CST2013-02-10 14:09:08 +0800 CST 2013-02-10 14:09:08 +0800 CST

Apache:发送到安全端口的不安全请求...想要重定向

  • 772

前言

首先:简单的端口 80 -> 端口 443 重写不会解决这个问题。几乎在之前的每个问题、邮件线程、论坛线程等中,我都发现这是第一个无知的响应,并且被重复了好几次。

其次:是的,我知道您不能在同一个端口上提供 HTTP 和 HTTPS 流量。 这不是那个。

设想:

Apache 服务器通过端口倍增托管多个站点。端口 80 服务于公共站点。端口 443 服务于该站点的安全版本。

端口 7443、8443 和 9443 分别服务于独立的 SSL 安全站点。

如果用户输错了 URL,或者给出了一个无效的链接,例如http://hostname.tld:7443,他们将看到以下可笑的页面:

Apache 错误请求错误消息

而不是服务器只是将它们重定向到https://hostname.tld:7443。

我的问题是,如何以Zeus 的屁眼的名义修改 Apache 的行为或此错误消息以自动重定向用户?

Apache 显然服务于非 https 请求(以显示该错误消息),即使它是为 HTTPS 配置的。在我看来,不只是默认进行重定向似乎非常愚蠢,但我可以理解为什么他们会采用他们所做的行为,即使我不同意。所以我的问题是:你能改变它吗?他们在某个地方处理错误,并且 Apache 是配置的聚宝盆,按理说在某处有一些指令来处理这种行为,但到目前为止,我在几个小时的修补中都找不到它。

更新:

我尝试了各种各样的事情,包括:

  • 使用ErrorDocument 400指令获取仅发送标头的 CGI 和 PHPStatus 301脚本Location。这会导致出现空白页。使用ErrorDocument 400 https://hostname.tld:7443simply 会导致该链接显示在页面上。

  • 使用mod_rewrite我或谷歌所能想到的几乎所有组合,包括完全指导网站的笼统声明;这些永远行不通。从字面上看,他们什么都不做。我猜测 Apache 在尝试处理重写指令之前就开始出现上述错误。

由于自定义端口的使用,我无法使用基于端口的重定向。我不能使用基于脚本的重定向,因为它们永远不会因为 http/https 不匹配而得到服务。我几乎愿意将其归因于错误或意外行为,但有人有先见之明,在其中放置了一条非常自定义的错误消息,他们没有费心去想也许你只想购物他们已经提供了URL ?

apache-2.2
  • 2 2 个回答
  • 12291 Views

2 个回答

  • Voted
  1. Best Answer
    hrunting
    2013-02-10T17:05:19+08:002013-02-10T17:05:19+08:00

    我认为这可能是 Apache 2.2 及更低版本处理这种特殊情况的错误。

    似乎在 SSL 读取400 Bad Request错误时,Apache 2.2 不返回 HTTP 响应代码或标头,仅返回 HTTP 响应主体。我通过远程登录到端口 443 并发送进行测试:

    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>
    

    请注意缺少 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>
    

    如果我像您一样设置 ErrorDocument 行:

    ErrorDocument 400 https://server.tld/
    

    然后我得到 302 重定向的 HTML,但同样没有标题。如果没有 302 重定向响应代码和Location:标头,浏览器将不会重定向。

    尝试升级到 Apache 2.4,看看它是否有效。我已经至少在 Apache 2.4.3 上进行了测试和确认,但我还没有努力找出行为更新的确切时间。我怀疑在他们为 2.4 所做的大量工作中,他们纠正了作为副作用的不良行为。

    相关的 Apache httpd 错误:

    • 44907
    • 50823

    更新

    您可以通过让脚本打印出它的标头(不会发送到客户端)来强制有缺陷的 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
    

    您应该知道,除了与没有 SSL 的 SSL 端口通信之外,还有其他原因可能会生成 400。确定这一点的简单方法是查找HTTPS环境变量。如果已设置,则 SSL 已正确协商,其他原因导致 400(如果是这种情况,请不要使用双标头技巧)。如果HTTPS未设置,请返回您的重定向,如上。

    • 7
  2. trent
    2013-02-10T14:33:32+08:002013-02-10T14:33:32+08:00

    您可以使用 mod-rewrite 修复此问题。设置规则以匹配任何内容。在Stackoverflow上查看此答案

    • -1

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve