通过http服务端口443会创build400错误请求错误,而不是redirect

因此,为了后代,我试图configuration我的服务器,以便即使有人试图去http:// domain.com:443,他们将被正确地redirect到该网站的https版本(https:// domain.com)。

当testing像http:// domain.com:443之类的东西时,它不会正确地redirect到https:// domain.com,而是使用下面的内容打开400错误请求页面:

错误的请求

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

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

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

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

但它没有工作。

所有域,子域和服务器IP本身都会出现此问题。

可能有关,试图做一个letsencrypt的干运行返回以下内容:

  Domain: domain.com Type: connection Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01 challenge 

针对启用网站的文件夹中列出的每个域。

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

如果客户\x16\x03...在发送HTTP请求(即, GET ..或类似的),或者正在启动TLS握手( \x16\x03... ),那么理论上可以根据来自客户端的第一个数据networking服务器不这样做。 相反,他们希望客户端正常工作,即在一个端口上使用普通HTTP(通常为80),在另一个端口上使用HTTPS(通常为443)。

您的http://example.com:443 URL会导致浏览器向端口443发出普通的HTTP请求。但服务器期待TLS,这意味着您的纯HTTP请求是意外的。 在这种情况下,Apache至less可以检查传入的HTTP请求数据是否可以为你提供更有用的描述:

原因:您正在向使用SSL的服务器端口说纯HTTP。 请使用HTTPSscheme访问此URL。

如果你使用其他服务器尝试这样的请求,那么他们可能会closures连接而没有任何错误,或者只是挂起,因为他们仍然希望从客户端获得TLS握手。

实际上,您正在寻找的是将HSTS头从networking服务器发送回给用户,告诉浏览器总是使用TLS访问网站。 在那里没有任何301redirect,正如你可以从任何浏览器的开发工具中看到的那样。

这发生在Google的例子中。 一旦您第一次访问Google,它会向您发送一个HSTS标头,您的浏览器将标头保存到列表中。 之后,当您尝试使用http://连接到google.com时,浏览器会自动将连接方法更改为https://而无需与远程Web服务器进行任何通信。

这是防止对安全层的攻击的另一个安全机制。

当您使用端口443访问站点时,将处理<VirtualHost *:80>部分内的任何内容。

testing启用Apache2默认站点的SSL版本,并尝试在那里conf <VirtualHost *:443>