如果用户访问以下网站,我该如何向用户显示连接重置错误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:443
说curl: (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。这样就好了 :)