nginx代理去掉URL前缀的实现方法
今天接到一个配置nginx的需求是:需要访问某个域名时,nginx可以去掉前缀去代理访问到后端
正常配置情况下:
在nginx配置文件中中设置了 location /prod-api/api
时 浏览器访问 /prod-api/api
反向代理到后端服务后,后端服务接收到的url地址实际还是 /prod-api/api
需要实现的功能需求:
访问url路径/prod-api/api
经过nginx反向代理后,到达后端服务的实际url地址为/api
。
以下是原nginx配置文件中location部分的配置内容:
server { listen 80; server_name localhost; charset utf-8; location / { root /usr/share/nginx/html/cashier; try_files $uri $uri/ /index.html; index index.html index.htm; } location /prod-api/ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:9076; } access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; }
将上述代码修改为如下nginx location代码:
server { listen 80; server_name localhost; charset utf-8; location / { root /usr/share/nginx/html/cashier; try_files $uri $uri/ /index.html; index index.html index.htm; } location ^~/prod-api/ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:9076/; } access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; }
注意点:
- 在proxy_pass 反向代理地址最后加一个/
- 在location匹配的url路径前添加^~/
location ^~/prod-api/:匹配任何以 /prod-api/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
- 不可以使用:
proxy_set_header Host $http_host;
我在现有环境的nginx里添加这段配置之后,访问会转不过去,查看nginx日志也只能看到是404信息,并没有更多定位问题的信息。检查了许久也没找到原因,于是注释掉location
里面所有配置,里面只加proxy_pass
这段配置,结果nginx是能够转发成功的,这说明单独来看这条location的配置是没有问题的,很有可能是现有环境nginx里的某些配置影响到了这个转发。
为了定位问题原因,location
下的配置逐个注释来定位问题,最后发现当注释掉proxy_set_header Host $http_host ;
这条配置之后,就能成功转发了。这才注意到是反向代理配置的问题。
此配置的作用是:把原http请求的Header中的Host字段也放到转发的请求里。
如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你请求的是哪个域名的资源的。
但是现有环境中原有的配置也不能随便删掉,所以可以进行如下设置:
即,在location里面添加一条 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
server { listen 8082; server_name 127.0.0.1; location /proxy/ { proxy_pass http://127.0.0.1:9301/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
总结
到此这篇关于nginx代理去掉URL前缀的实现方法的文章就介绍到这了,更多相关nginx代理去掉URL前缀内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
强大的 Web 应⽤服务器OpenResty安装(Nginx仓库)
OpenResty 是⼀个强大的 Web 应⽤服务器,Web 开发⼈员可以使用 Lua 脚本语⾔调动 Nginx ⽀持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统2023-06-06nginx中的正则表达式及location和rewrite总结
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向,这篇文章主要介绍了nginx中的正则表达式及location和rewrite总结,需要的朋友可以参考下2023-12-12
最新评论