V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
daimaosix
V2EX  ›  NGINX

请教如何通过反向代理请求路径时加入查询参数?呢?

  •  
  •   daimaosix · 288 天前 · 1125 次点击
    这是一个创建于 288 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务需要通过 Nginx 反向代理 Get 请求后端接口,但发现反向代理服务器访问路径中无法添加查询参数?

    原配置

      location /net/comm/ {
        proxy_pass http://localhost:9000;
        proxy_set_header Host localhost;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    

    这样可以通过访问 http://a.com/net/comm/127.0.0.1 获取数据

    但需要将请求路径调整为 http://a.com/net/comm/?ip=127.0.0.1 获取数据时,调整了反代规则:

      location /net/comm/?ip= {
        proxy_pass http://localhost:9000;
        proxy_set_header Host localhost;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    

    此时,反向代理服务器会报 404 错误。接着又进行了调整:

      location ^~ /net/comm/ {
        proxy_pass http://localhost:9000;
        proxy_set_header Host localhost;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    

    此时,接口会返回 404 错误。

    麻烦 V 友给看看,需要怎么调整才可以实现带查询参数访问呢?将请求路径 http://a.com/net/comm/127.0.0.1 调整为 http://a.com/net/comm/?ip=127.0.0.1

    16 条回复    2021-02-22 17:56:40 +08:00
    maocat
        1
    maocat  
       288 天前
    $query_string
    daimaosix
        2
    daimaosix  
    OP
       288 天前
    @maocat 是这样的吗老哥
    location ^~ /net/comm/$query_string {
    proxy_pass http://localhost:9000;
    proxy_set_header Host localhost;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    daimaosix
        4
    daimaosix  
    OP
       288 天前
    @maocat 下午用$query_string 试了一下还是不行。。可能是我放的位置不对吧,测试了好几次都没通过。。
    oxromantic
        5
    oxromantic  
       288 天前
    问句题外话, 既然 set_header 管用, 为了快速上线, 为啥不用 header 传参方式呢?
    ksmagi
        6
    ksmagi  
       288 天前
    oxromantic
        7
    oxromantic  
       288 天前
    @ksmagi 你这个只是客户端跳转行为吧, 不是反向代理
    daimaosix
        8
    daimaosix  
    OP
       288 天前
    @oxromantic 主要是没用 header 做过。。。
    oxromantic
        9
    oxromantic  
       288 天前
    @daimaosix 你的例子里都有 3 个设 header 的方式, 例子还不够么...
    daimaosix
        10
    daimaosix  
    OP
       288 天前
    @oxromantic 这个我搜索了一下好像不能给 url 传参吧
    ksmagi
        11
    ksmagi  
       288 天前   ❤️ 1
    @oxromantic rewrite 不是 redirect/permanent 的时候不是客户端重定向。
    解决方案如下:
    location = /test/ {
    proxy_pass http://127.0.0.1:8000;
    }
    location /test/ {
    rewrite ^/test/(.*)$ /test/?q=$1 last;
    }
    daimaosix
        12
    daimaosix  
    OP
       288 天前
    @ksmagi 谢谢啊老哥,我刚才试了一下,接口还是返回 404 错误
    ksmagi
        13
    ksmagi  
       288 天前
    @daimaosix 盲猜 location 匹配顺序上的问题 https://stackoverflow.com/a/45129826
    刚刚 at 错 oxromantic 老哥不好意思
    daimaosix
        14
    daimaosix  
    OP
       288 天前
    @ksmagi 我又试了一遍,调整了一下,接口还是 404.。。
    daimaosix
        15
    daimaosix  
    OP
       288 天前
    @ksmagi 是因为 proxy_pass 的不对嘛,我刚才检查了一下应该是 proxy_pass http://127.0.0.1:8000/ip/
    zpfhbyx
        16
    zpfhbyx  
       288 天前
    location ^~ /net/comm/(.*) {
    proxy_pass http://127.0.0.1:8000/ip/?ip=$1&$query_string
    }
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3576 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:30 · PVG 09:30 · LAX 17:30 · JFK 20:30
    ♥ Do have faith in what you're doing.