在 Nginx 反向代理中使用动态主机时替换 URI

在 Nginx 反向代理中使用动态主机时替换 URI

仅供参考-我怀疑这有一个非常明显/简单的答案(我是 nginx 新手)

我在用动态上游作为我的 Nginx 配置的一部分。这意味着在proxy_pass指令中使用变量,指示 nginxresolver在上游出现问题(未知主机/无法连接)时使用而不是崩溃/不启动。

但是,这似乎也改变了proxy_pass对 URI 的处理。它似乎忽略了请求 URI,而不是用proxy_pass指令中指定的 URI 替换请求 URI。我正在寻找一种方法来保留(或重现)允许我继续使用动态主机的原始行为。

我尝试在这里创建一个最小的示例配置:

server {
    listen 80;
    server_name my-server.com;

    # My chosen DNS server (in this case, the Docker DNS)
    resolver 127.0.0.11 valid=30s ipv6=off;

    # This works
    location / {
        set $upstream frontend:8080;
        proxy_pass http://$upstream;
    }

    # This does not work :-( 
    # The original URI (e.g. /api/users/tommy) is ignored, and 
    # all requests to api-server are directly to /api/
    location /api/ {
        set $upstream api-server:8002;
        proxy_pass http://$upstream/api/;
    }
}

一种解决方法是从指令中删除 URI proxy_pass,并让上游服务器监听所需的确切 URI。这并不理想,因为网关服务器的核心优势是增加了一些灵活性,可以独立更改内容(如果需要,可以重写 URI)

例如,

    # This kind of works, but upstream must listen on /api 
    location /api {
        set $upstream api-server:8002;
        proxy_pass http://$upstream;
    }

答案1

文档指出如果你在proxy_pass指令中使用变量您指定一个 URI 部分,它将“按原样”向上游传递。

您需要捕获需要向上游发送的 URI 部分。可以使用正则表达式块location,例如:

location ~ ^/api(.*)$ {
    set $upstream ...;
    proxy_pass http://$upstream$1;
}

或者使用 来rewrite...break改变当前 URI,例如:

location /api {
    set $upstream ...;
    rewrite ^/api(.*)$ $1 break;
    proxy_pass http://$upstream;
}

相关内容