使用proxy_path时Nginx不附加路径

63lcw9qa  于 2023-02-03  发布在  Nginx
关注(0)|答案(1)|浏览(164)

我尝试使用Nginx作为一些后端的反向代理,这可能无关紧要,但后端都托管在一个Docker网络中,并且该网络是使用docker-compose创建的。
所有后端都具有需要公开的相同端点,因此为了减少重复的配置行,我尝试使用map

map $http_host $backend {
    host-a.example.com host-a;
    host-b.example.com host-b;
}

server { 
    listen                  443 ssl;
    listen                  [::]:443 ssl;
    server_name             _;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;

    location / {
        # there is no DNS resolution if we set proxy_pass targets dynamically, 
        # use the docker internal DNS server
        resolver 127.0.0.11; 
        proxy_pass "http://$backend:8080/";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

添加了resolver行,否则Nginx将给予错误:no resolver defined to resolve *hostname*
然而,在这种配置下,我发现请求被发送到了错误的路径,例如,如果我向https://host-a.example.com/bookshttps://host-a.example.com/books/123/front-cover.jpg发送请求,返回的页面总是站点的根(即https://host-a.example.com/),似乎由于某种原因,proxy_pass不包括请求到后端服务器的路径。
有没有办法让map也可以使用这个方法,或者我需要为我想代理请求的每个后端创建一个单独的server块。

ctzwtxfj

ctzwtxfj1#

proxy_pass文档中:
在proxy_pass中使用变量时

在这种情况下,如果在指令中指定了URI,则它将按原样传递给服务器,替换原始请求URI。
您应该删除尾随的/(文档将其称为 * optional URI *):

proxy_pass http://$backend:8080;

或者提供请求的完整URL(作为内置变量提供,非常方便):

proxy_pass http://$backend:8080$request_uri;

相关问题