今天接到一个配置nginx的需求是:需要访问某个域名时,nginx可以去掉前缀去代理访问到后端
正常配置情况下:
location /prod-api/api/prod-api/api/prod-api/api
需要实现的功能需求:
/prod-api/api/api
以下是原nginx配置文件中location部分的配置内容:
将上述代码修改为如下nginx location代码:
注意点:

- 在proxy_pass 反向代理地址最后加一个/
- 在location匹配的url路径前添加^~/
location ^~/prod-api/:匹配任何以 /prod-api/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
proxy_set_header Host $http_host;
locationproxy_pass
locationproxy_set_header Host $http_host ;
此配置的作用是:把原http请求的Header中的Host字段也放到转发的请求里。
如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你请求的是哪个域名的资源的。
但是现有环境中原有的配置也不能随便删掉,所以可以进行如下设置:
proxy_set_header Host $proxy_host;
设置 proxy_set_header Host $host 时,浏览器直接访问 nginx,获取到的 Host 是 $host 的值,没有端口信息。此时代码中如果有重定向路由,那么重定向时就会丢失端口信息,导致 404
补充知识:Nginx 转发时去掉前缀保留传参
最终效果
Nginx 将
127.0.0.1:8082/proxy/switchSystemRole?roleId=29
转发至
127.0.0.1:9301/switchSystemRole?roleId=29
总结