我的网站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
给出此错误:
我尝试重定向流量,从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的正确方法是什么?
答案 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请求,并向客户端返回“错误请求”消息,并解释说它是对这个端口的错误请求。