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

时间:2015-05-26 10:43:04

标签: .htaccess redirect ssl https virtualhost

我的网站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已将此网址编入索引:

http://www.example.com:443

给出此错误:

enter image description here

我尝试重定向流量,从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的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

  

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)并单独处理它们,但服务器通常不支持这些功能,因为通常的方法是使用端口80作为http,使用端口443作为https。

这意味着,服务器需要在端口443处进行TLS握手。服务器检测到它没有获得TLS握手而是获取HTTP请求,并向客户端返回“错误请求”消息,并解释说它是对这个端口的错误请求。