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匹配
额外验证建议
- 重启Nginx服务:
sudo nginx -s reload - 测试普通请求:用
curl http://api-snipe-node.net/your-endpoint?params=xxx查看是否返回正确结果 - 测试WebSocket连接:用WebSocket客户端连接
ws://api-snipe-node.net,检查是否能正常建立连接并通信
内容的提问来源于stack exchange,提问作者Singh
相关产品推荐
相关产品推荐

