![在 Nginx 反向代理中使用动态主机时替换 URI](https://linux22.com/image/740294/%E5%9C%A8%20Nginx%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8A%A8%E6%80%81%E4%B8%BB%E6%9C%BA%E6%97%B6%E6%9B%BF%E6%8D%A2%20URI.png)
仅供参考-我怀疑这有一个非常明显/简单的答案(我是 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;
}