当您执行以下操作时会发生此问题:
- 发出带有标头“Host”和端口的请求,例如“Host:www.example.com:80”,根据https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23。例如,你可以用 curl 来做
curl -v -H "Host: www.example.com:80" -X GET -i http://www.example.com
- 服务器针对该请求发出重定向到 https 的操作,在我的例子中,使用以下 RewriteRule
RewriteCond %{HTTPS} 关闭 重写规则 (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
我注意到响应的“Location”标头也包含端口,它与请求的“Host”标头中指定的端口相同。因此服务器将响应“Location:https://www.example.com:80“,这是错误的。
我在使用“Apache/2.4.7 (Ubuntu)”时遇到了这个问题,但我注意到 Varnish 缓存服务器也存在这个问题。为什么会出现这种情况?有办法纠正这个问题吗?
答案1
HTTP_HOST 指的是指定的 Host:标头,因此您的配置将根据您的指示按预期工作。
如果您愿意,您可以剥离端口,或者通过匹配并使用反向引用来指定另一个端口:
删除端口并默认为 https:
RewriteCond %{HTTP_HOST} ^([^:]+)(:[0-9]+)?$
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
将端口更改为其他端口(此处为 8443):
RewriteCond %{HTTP_HOST} ^([^:]+)(:[0-9]+)?$
RewriteRule ^ https://%1:8443%{REQUEST_URI} [R=301,L]