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

<VirtualHost *:80>
    ServerAdmin [email protected]
    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


给出此错误:



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

最佳答案

将所有流量从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请求,然后将“错误请求”消息返回给客户端,说明这是错误的请求此端口。

关于.htaccess - 将HTTP流量从443端口重定向到SSL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30456257/

10-10 02:38