错误的请求

错误的请求

如果用户访问以下网站,我该如何向用户显示连接重置错误http://example.com:443,而不是给出以下错误:

错误的请求

您的浏览器发送了一个此服务器无法理解的请求。
原因:您正在向启用 SSL 的服务器端口发送纯 HTTP 请求。
请使用 HTTPS 方案访问此 URL。

上述错误是 Apache 提供给用户的,我并不想看到。我只想停止连接,而不是给出文本响应。这可能吗?应该是的,因为很多网站都有这个功能。提前谢谢大家。(另外,我自己无法尝试任何东西,因为我对它的工作原理一无所知,所以如果可以的话,我可以自己实现它)。

在某种程度上类似,但无论如何都没有回答我的问题: 通过 http 为 443 端口提供服务会产生 400 Bad Request Error,而不是重定向,但提到:“如果你尝试使用其他服务器发送此类请求,那么他们要么会直接关闭连接,要么干脆挂起,因为他们仍然希望从客户端获得 TLS 握手”,所以我的问题是,如果用户访问,如何关闭连接http://example.com:443

万一:

请注意,当用户访问 http:// 而不是 https:// 上的端口 443 时,我想关闭连接。我不希望 apache 显示错误请求消息。我想关闭连接,因为据说不可能将 http:// 上的 443 重定向到 https://。如果有任何方法可以做到这一点,请告诉我(除了 HSTS,我不愿意信任它)。我认为这将使用防火墙来完成(不确定)。我也见过 cPanel 这样做,但我没有将 cPanel 用于其他目的,所以请不要要求我这样做。

还:

除非修改 Apache 的源代码,否则无法更改 400 错误请求页面,因此无法从 http 重定向到 https。我认为我没有被允许修改 Apache 的源代码。

我还看到运行curl http://www.google.com:443curl: (52) Empty reply from server,所以发送一个空回复应该足以停止连接,对吗?我不确定。但也许是的,如果是这样,怎么做?(如果有其他方法可以切断连接,请不要回答这个问题)。

要明确的是:我要求的是类似sudo ufw deny out 443 http(可能是无效的)或类似的东西。

答案1

很有趣。那么像这样的东西怎么样:

<VirtualHost *:443>
    <Location />
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    </Location>

这将拒绝除本地主机之外的任何流量到端口 443。

但实际上我认为你可能想要做的(?)只是将所有 http 请求重定向到 https。重定向后 443 将是多余的。

答案2

我在目录中的 Apache 源代码中编辑一个文件./modules/ssl/ssl_engine_kernel.so

在该文件中,你可以找到一行:

    if (sslconn->non_ssl_request == NON_SSL_SET_ERROR_MSG) {
        apr_table_setn(r->notes, "error-notes",
                       "Reason: You're speaking plain HTTP to an SSL-enabled "
                       "server port.<br />\n Instead use the HTTPS scheme to "
                       "access this URL, please.<br />\n");

        /* Now that we have caught this error, forget it. we are done
         * with using SSL on this request.
         */
        sslconn->non_ssl_request = NON_SSL_OK;

        return HTTP_BAD_REQUEST;
    }

请使用 HTTPS 方案来访问此 URL......`。

将其更改为:

    if (sslconn->non_ssl_request == NON_SSL_SET_ERROR_MSG) {
        /*
        apr_table_setn(r->notes, "error-notes",
                       "Reason: You're speaking plain HTTP to an SSL-enabled "
                       "server port.<br />\n Instead use the HTTPS scheme to "
                       "access this URL, please.<br />\n");
        */
        /* Now that we have caught this error, forget it. we are done
         * with using SSL on this request.
         */
        sslconn->non_ssl_request = NON_SSL_OK;

        return apr_pstrcat(NULL);
    }

然后,重新编译 Apache。这样就好了 :)

相关内容