带有 URI 修改的 NGINX proxy_pass

带有 URI 修改的 NGINX proxy_pass

我需要将一些请求传递给代理(运行 GlassFish),并删除一部分 URL。例如:

https://xxx.net/jazz/MobileApi?id=2&make_id=4

应传递给代理:

http://X.X.X.X:8080/MobileApi?id=2&make_id=4

我有以下 Nginx 配置:

upstream vito_api {
    server 178.63.X.X:8080;
}

server {
    listen 80;
    listen 443 ssl;
    ....

    location ~ /jazz/(?<section>.*) {
       proxy_pass http://vito_api/$section/;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

但不幸的是,请求传递时没有参数。因此,在 GlassFish 访问日志中,我只能看到:

"148.251.X.X" "NULL-AUTH-USER" "05/Jan/2015:15:18:40 +0100" "GET /MobileApi/ HTTP/1.0" 200 21

我做错了什么?如何传递 URL 参数?

谢谢。

答案1

nginx 的文档(上下文:前缀位置)

如果 proxy_pass 指令指定了 URI,那么当请求传递给服务器时,规范化请求 URI 中与位置匹配的部分将被指令中指定的 URI 替换。

因此可以简化如下:

location /jazz/ {
    proxy_pass http://vito_api/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

答案2

我知道这是一个老问题,但我在寻找这个问题时发现了另一个,我相信这是最简单的解决方案。使用 proxy_pass 时,您不能使用 uri,但您可以将其用作变量。就像这里:

location  ~ ^/app/(.*)$ {
# proxy_pass   http://127.0.0.1/some_dir;       # error
proxy_pass   http://127.0.0.1/some_dir/$1;      # ok
}

答案3

对于您的问题,这将对您有用。使用正则表达式。

location ^~ /jazz/ {
    rewrite ^/jazz/(.*)$ /$1? break;
    proxy_pass http://vito_api;
}

答案4

Andrey,这不行。保持简单 :)

根据 nginx 文档:

在某些情况下,无法确定要替换的请求 URI 的部分:

当使用正则表达式指定位置时。 在这种情况下,应在不使用 URI 的情况下指定指令。

所以,请,

proxy_pass http://vito_api;

相关内容