代码之家  ›  专栏  ›  技术社区  ›  Jakob Abfalter

Nginx返回400作为外部URL的代理传递

  •  0
  • Jakob Abfalter  · 技术社区  · 6 年前

    我试图在Nginx中有一个路由,它将请求代理到外部https资源。我的配置如下:

    server {
        listen 443 ssl;
        server_name x.x.com;
    
        location / {
            resolver 8.8.8.8;
            proxy_pass https://y.y.com$request_uri;
            proxy_ssl_server_name on;
        }
    }
    

    现在,每当我尝试调用URL时,我会立即得到400。

    奇怪的是,在Nginx日志上,我一开始不会得到400的任何理由。只有1分钟后,我才会收到超时消息。(我的错误日志级别设置为info)

    nginx_1_e6b52cd440fd | 999.999.99.999 - - [29/Aug/2019:10:05:27 +0000] "GET / HTTP/1.1" 400 226 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
    nginx_1_e6b52cd440fd | 2019/08/29 10:06:27 [info] 67#67: *30 client timed out (110: Connection timed out) while waiting for request, client: 999.999.99.999, server: 0.0.0.0:8080
    

    我的Nginx使用Nginx:1.17作为docker容器运行

    0 回复  |  直到 6 年前
        1
  •  1
  •   Jakob Abfalter    6 年前

    对于遇到类似问题的人,我最后通过添加

    proxy_set_header Host y.y.com;
    proxy_set_header X-Forwarded-For $remote_addr;
    

    出于某种原因,服务器不喜欢具有默认x.x.com主机头的请求,并用400拒绝了该请求,400可能来自服务器端的某些web服务器配置。