You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NGINX带参数URI在命名location中反向代理失败求助

问题解决:Nginx反向代理带参数URI返回404的修复方案

问题分析

你的配置核心问题有两个:

  • proxy_pass 未正确拼接目标路径(即Quiknode的API密钥后缀),导致请求未到达正确的上游端点
  • Host 头设置为自身域名,上游服务器(如Quiknode)无法识别请求归属,返回404

修正后的配置

upstream socketreq {
    server xxxxxxxx.solana-mainnet.discover.quiknode.pro;
    server api.mainnet-beta.solana.com backup;
}
upstream httpsreq {
    server xxxxxxxx.solana-mainnet.discover.quiknode.pro;
    server solana-api.projectserum.com backup;
    server api.mainnet-beta.solana.com backup;
}
server {
    listen  80;
    server_name api-snipe-node.net;
    client_max_body_size 100m;

    location / {
        try_files /nonexistent @$http_upgrade;
    }

    # WebSocket 请求处理
    location @websocket {
        # 将原始请求URI追加到Quiknode的API密钥路径后
        rewrite ^/(.*)$ /19a23aa44e703b2ee18ac2eeaadxxxxxxxxxx/$1 break;
        proxy_pass http://socketreq;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        # 设置Host为上游服务器域名,确保Quiknode正确识别
        proxy_set_header Host xxxxxxxx.solana-mainnet.discover.quiknode.pro;
        proxy_cache_bypass $http_upgrade;
    }

    # 普通HTTPS/HTTP请求处理
    location @ {
        # 同样将原始请求URI追加到API密钥路径后
        rewrite ^/(.*)$ /19a23aa44e703b2ee18ac2eeaadxxxxxxxxxx/$1 break;
        proxy_pass http://httpsreq;
        # 设置正确的上游Host头
        proxy_set_header Host xxxxxxxx.solana-mainnet.discover.quiknode.pro;
        # 可选:保留原始客户端IP等信息
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root  /usr/share/nginx/html;
    }
}

关键改动说明

  • rewrite规则:rewrite ^/(.*)$ /API_KEY/$1 break; 将客户端请求的所有URI(比如/abc?param=1)转换为/19a23aa44e703b2ee18ac2eeaadxxxxxxxxxx/abc?param=1,确保参数和路径都正确传递
  • Host头修正:将proxy_set_header Host设置为上游Quiknode服务器的域名,而不是自身的api-snipe-node.net,因为Quiknode的服务需要通过Host识别你的节点实例
  • WebSocket参数保留:rewrite规则中的$1会捕获原始请求的路径部分,配合break标志确保规则执行后直接进入proxy_pass阶段,不会触发其他location匹配

额外验证建议

  1. 重启Nginx服务:sudo nginx -s reload
  2. 测试普通请求:用curl http://api-snipe-node.net/your-endpoint?params=xxx查看是否返回正确结果
  3. 测试WebSocket连接:用WebSocket客户端连接ws://api-snipe-node.net,检查是否能正常建立连接并通信

内容的提问来源于stack exchange,提问作者Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:15:34