我配置了这个 nginx 服务器作为example.com
缓存www.example.com
/反向代理,从 mysource.example.com 获取数据
它在浏览器中似乎运行良好,但我注意到谷歌排名明显下降,当我用 wget 测试 URL 时,出现了无限循环。
# test without www , getting infinite loop
wget --header="Host: example.com" http://[SERVER IP]/file.html
Location: https://www.example.com/file.html [following]
--2020-02-07 21:43:14-- https://www.example.com/file.html
Reusing existing connection to www.example.com:443.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.example.com/file.html [following]
20 redirections exceeded.
^^^ RIGHT HERE !!!
# but with www it works OK:
wget --header="Host: www.example.com" http://[SERVER IP]/file.html
HTTP request sent, awaiting response... 200 OK
Length: 1307 (1.3K) [text/plain]
Saving to: ‘file.html’
我想我需要host
在从非 www 到 www 的重定向中指定另一个?!
或者这只是wget 东西因为它通常应该在第一次重定向时切换到 www.example.com,但它会保留 nginx 命令中的非 www 主机?
# redirect http to https
server {
listen 80;
server_name example.com;
server_name www.example.com;
proxy_set_header Host www.example.com
return 301 https://www.example.com$request_uri;
}
# and redirect non www to www
server {
listen 443 ssl http2;
server_name example.com;
proxy_set_header Host www.example.com;
return 301 https://www.example.com$request_uri;
}
# main server, SSL
server {
listen 443 ssl http2;
server_name www.example.com;
location / {
proxy_pass http://mysource.example.com:81;
proxy_set_header Host www.example.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache nginx_ramdisk_cache;
}
} # end of server
答案1
问题出在你使用 的方式上wget
。通过使用:
wget --header="Host: example.com" http://example.com/file.html
你替换Host
了每一个要求获得将执行。因此:
- wget 连接到
80
你的服务器端口并重定向到https://www.example.com/file.html
, - wget 连接到
443
服务器的端口,但发送Host: example.com
标头而不是Host: www.example.com
。它会重定向到https://www.example.com/file.html
, - 我们 2 点回来。
所以,你的配置没有问题,只是测试出了问题。你永远不应该覆盖Host
标头,获得将自动将其设置为 URL 中的域。