设置正确的请求主机以避免 nginx 中的这种无限循环

设置正确的请求主机以避免 nginx 中的这种无限循环

我配置了这个 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每一个要求获得将执行。因此:

  1. wget 连接到80你的服务器端口并重定向到https://www.example.com/file.html
  2. wget 连接到443服务器的端口,但发送Host: example.com标头而不是Host: www.example.com。它会重定向到https://www.example.com/file.html
  3. 我们 2 点回来。

所以,你的配置没有问题,只是测试出了问题。你永远不应该覆盖Host标头,获得将自动将其设置为 URL 中的域。

相关内容