将 HTTP 流量从 443 端口重定向到 SSL

Posted

技术标签:

【中文标题】将 HTTP 流量从 443 端口重定向到 SSL【英文标题】:Redirect HTTP traffic from 443 port to SSL 【发布时间】:2015-08-07 23:48:39 【问题描述】:

我有一个站点 www.example.com,它使用 RewriteEngine 将 HTTP 流量重定向到 HTTPS:

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/example.com/
    ....

    RewriteEngine on
    RewriteCond %HTTP_HOST   ^example.com [NC]
    RewriteRule   ^(.*)$ https://www.example.com$1  [L]
    RewriteCond %SERVER_PORT ^80$
    RewriteRule .* https://%SERVER_NAME%REQUEST_URI [R,L]
</VirtualHost>

我发现的问题是 google 已将这个 URL 编入索引:

http://www.example.com:443

给出这个错误:

我已尝试重定向流量,添加来自 80 和 443 虚拟主机的永久重定向:

<VirtualHost *:80>
    ...
    RewriteEngine on
    #RewriteCond %HTTP_HOST   ^example.com [NC]
    #RewriteRule   ^(.*)$ https://www.example.com$1  [L]
    #RewriteCond %SERVER_PORT ^80$
    RewriteRule .* https://%SERVER_NAME%REQUEST_URI [R,L]
</VirtualHost>

<VirtualHost *:443>
    ...
    RewriteEngine on
    RewriteRule .* https://%SERVER_NAME%REQUEST_URI [R,L]
</VirtualHost>

没有成功。将所有流量从http://www.example.com:443(和派生页面)重定向到https://www.example.com 的正确方法是什么?

【问题讨论】:

这与this question 中的问题或多或少相同。这里的错误是首先将http://www.example.com:443 编入索引。你知道为什么会这样吗?当然,如果当前已被 Google 编入索引,则最终会从索引中删除(尤其是在您修复了导致此问题的任何原因之后)。 不,我不知道它是怎么发生的。我检查了所有链接,没有一个有 :443 端口规范。都指向https。所以我想它是从外部来源链接的。 【参考方案1】:

将所有流量从http://www.example.com:443(和派生页面)重定向到https://www.example.com 的正确方法是什么?

没有这样的方法:

http://www.example.com:443 表示与443端口建立TCP连接,然后直接讲HTTP https://www.example.com:443 表示与端口 443 建立 TCP 连接,进行 TLS 握手,然后在此 TLS 连接中使用 HTTP。

如您所见,两个访问都使用到同一个端口的 TCP 连接,但一个是向服务器发送 HTTP,而另一个是向同一服务器发送 TLS(相同的主机和端口意味着相同的服务器)。虽然理论上可以区分 HTTP 请求(http://...:443)和 TLS 握手的开始(https://...:443)并分别处理它们,但服务器通常不支持这种功能,因为通常的方法是http 使用 80 端口,https 使用 443 端口。

这意味着,服务器期望在端口 443 进行 TLS 握手。服务器检测到它没有得到 TLS 握手,而是一个 HTTP 请求,并向客户端返回“Bad Request”消息,说明它是对该端口的请求类型错误。

【讨论】:

是的,很清楚,谢谢。但可以肯定的是,我可以做一些事情来避免这个问题。例如,如果我在浏览器中输入mail.google.com:443 或facebook.com:443,网络服务器将重定向到相应的website.com 页面。 @Ivan 我怀疑这是HSTS 的副作用(这两个网站都使用)。网络上实际上没有发送纯 HTTP 消息。 好吧,如果我理解正确的话,我能做的最好的就是找到链接到example.com:443的网站,并要求更改链接以避免谷歌抓取。对吗? @Ivan:是的。从用户或爬虫的角度来看,如果一个网站链接到http://example.com:12345http://example.com.something.wrong,这将是相同的——用户不会访问您的网站,而是会收到一些错误消息。唯一的区别是您可能不会在服务器端注意到它。 是的,我明白,不好的部分是谷歌索引那个坏链接。谢谢。

以上是关于将 HTTP 流量从 443 端口重定向到 SSL的主要内容,如果未能解决你的问题,请参考以下文章

[转帖]nginx 80端口重定向 转发到443端口

nginx端口重定向及反向代理

根据 URL 从 80 端口重定向到不同的端口

Nginx中处理重定向端口丢失问题

串行端口重定向或拆分[关闭]

apache安装了ssl,现要将80端口的http访问重定向到443端口的https,怎么办?