通过 http 服务端口 443 会创建 400 Bad Request Error 而不是重定向

Bit*_*itz 8 ssl http apache-2.4

因此,为了后代的缘故,我正在尝试配置我的服务器,以便即使有人尝试访问 http://domain.com:443,他们也会被正确重定向到该站点的 https 版本(https://域名.com)。

在测试诸如 http://domain.com:443 之类的内容时,它没有正确重定向到 https://domain.com,而是被一个包含以下内容的 400 Bad Request 页面击中:

错误的请求

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

Apache/2.4.18 (Ubuntu) 服务器在 sub.domain.com 端口 443

我尝试在我的000-default.confin 中包含以下几行<VirtualHost *:80>

RewriteEngine On 
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)

但它没有用。

此问题发生在所有域、子域和服务器 IP 本身上。

可能相关,尝试对 letencrypt 进行试运行会返回以下信息:

   Domain: domain.com
   Type:   connection
   Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01
   challenge
Run Code Online (Sandbox Code Playgroud)

对于启用站点的文件夹中列出的每个域。

Ste*_*ich 11

TL;TR:您不能在同一端口 (443) 上同时提供 HTTP 和 HTTPS。

虽然理论上可以根据来自客户端的第一个数据来确定客户端是否正在发送 HTTP 请求(即GET ..或类似请求)或正在启动 TLS 握手(\x16\x03...),但大多数 Web 服务器不会这样做。相反,他们希望客户端能够正常运行,即在一个端口(通常为 80)上使用纯 HTTP,在另一个端口(通常为 443)上使用 HTTPS。

您的 URLhttp://example.com:443导致浏览器向端口 443 发出纯 HTTP 请求。但服务器在那里期待 TLS,这意味着您的纯 HTTP 请求是意外的。在这种情况下,Apache 至少足以检查纯 HTTP 请求的传入数据是否足够好,以便它可以为您提供更有用的描述:

原因:您对启用 SSL 的服务器端口使用纯 HTTP。请改用 HTTPS 方案访问此 URL。

如果您尝试与其他服务器进行此类请求,那么它们要么完全没有错误地关闭连接,要么只是挂起,因为它们仍然希望从客户端获得 TLS 握手。

  • 谢谢提供信息。虽然 - 我理解其中的区别,但我并没有尝试通过 http 服务 :443,当用户尝试在 http url 上调用 443 时,我试图强制重定向。编辑:我什至尝试这样做的原因是因为我已经看到其他网络主机正确处理这些奇怪的连接。 (2认同)

小智 5

我有同样的错误,罪魁祸首是我的配置试图在我的非 SSL 端口上启用 SSL。任何以 开头的网站地址http://都将通过端口 80 ( <VirtualHost *:80>) 传送,并且该主机不想了解有关 SSL 的任何信息。任何以 开头的站点https://都将通过端口 443 ( <VirtualHost *:443>)

更直接的问题是我的*:80主机下有以下 SSL 详细信息,这使 Apache 尝试为非 SSL 连接启用 SSL。

SSLEngine on
SSLCertificateFile /bla.crt
SSLCertificateKeyFile /bla.key
SSLCertificateChainFile /bla.crt
Run Code Online (Sandbox Code Playgroud)

*:80(并确保它们出现在<VirtualHost *:443>)中删除这些行后,我的服务器再次弹出。

所以,这是我的<VirtualHost>s(全部都在,/etc/apache2/sites-available/http.conf但根据您的设置可能会有所不同):

<VirtualHost *:80>

    -- snip --

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

</VirtualHost>


<VirtualHost *:443>

    -- snip --

    SSLEngine on
    SSLCertificateFile /var/www/ssl/STAR_iconcierge_net_au.crt
    SSLCertificateKeyFile /var/www/ssl/STAR_iconcierge_net_au.key
    SSLCertificateChainFile /var/www/ssl/STAR_iconcierge_net_au.crt

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

请注意*:80(http)如何对*:443(https)进行重写,然后使用该SSLEngine on指令强制执行 SSL 。