Nginx配置求助:域名转发保留URL及动态查询参数
Nginx配置实现跨域请求转发(地址栏保持原URL+传递所有查询参数)
我之前刚好处理过一模一样的需求,给你一套可以直接复用的Nginx配置,同时拆解下每个部分的作用,方便你理解和调整:
server { listen 443 ssl; server_name firstserviceendpoint.com; # 替换成你自己的SSL证书路径 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/private.key; location /app/products { # 核心转发规则:直接指向服务2的域名,Nginx会自动带原请求的URI和所有查询参数 proxy_pass https://secondServiceEndpoint.com; # 保留原请求的Host头,避免服务2因为Host不匹配拒绝请求 proxy_set_header Host $host; # 传递原请求的Referer头,部分服务会校验这个字段 proxy_set_header Referer $http_referer; # 把客户端真实IP传给服务2,方便日志排查 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 处理跨域CORS问题,让浏览器接受跨域响应 add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; add_header Access-Control-Allow-Headers *; add_header Access-Control-Allow-Credentials true; # 浏览器预检请求直接返回204,不用转发到服务2 if ($request_method = OPTIONS) { return 204; } } }
关键配置说明:
proxy_pass写法:这里只写服务2的域名,而不是完整路径,Nginx会自动把原请求的/app/products和后面所有查询参数(比如?param1=a¶m2=b)拼接到服务2的域名后,完美实现参数全传递。如果写成proxy_pass https://secondServiceEndpoint.com/app/products;也能行,但前者更灵活,后续路径变动时不用改这一行。proxy_set_header系列:这些头是为了让服务2“以为”请求是直接来自服务1的,避免因为Host校验、IP白名单等规则拒绝请求,同时也能让服务2的日志记录到真实的客户端IP。- CORS响应头:因为是跨域名转发,浏览器会触发同源策略校验,添加这些头可以让浏览器允许跨域请求,尤其是如果你的请求带Cookie或者自定义头的话,
Access-Control-Allow-Credentials true是必须的。 - OPTIONS请求处理:浏览器在发送POST/PUT这类非简单请求前,会先发一个OPTIONS预检请求确认权限,直接返回204可以减少不必要的转发,提升性能。
额外注意事项:
- 确保你的Nginx已经安装了
ngx_http_proxy_module(默认编译时都会包含,不确定的话可以用nginx -V查看编译参数)。 - 配置写完后,用
nginx -t命令检查语法是否正确,没问题的话执行nginx -s reload重启生效。 - 如果服务2有特殊的请求头校验,比如需要特定的
User-Agent,可以在proxy_set_header里添加对应的字段。 - 如果需要转发服务1的所有请求(而不只是
/app/products),把location /app/products改成location /即可。
内容的提问来源于stack exchange,提问作者code1234
相关产品推荐
相关产品推荐

