nginx前后端不分离项目代理配置

文章目录

现在很多时候都是前后端分离的项目,所以配置代理的时候,前端和后端的代理分开配置,各访问各的,互不干扰。
但是在前后端不分离的项目中,nginx代理有些不同,特此在这记录一下。

了解

前后端不分离的项目,访问页面是通过请求转发请求重定向的方式。每一次的转发和重定向,后端项目本身都会携带着自己的content-path,这样使得在nginx代理的时候,转发和重定向的请求不能再次被nginx拦截,从而导致请求不到页面或者接口。

举例1:一个项目content-path路径配置为空,使用nginx代理。

nginx.conf:配置如下

nginx 复制代码
# my_project是nginx会识别拦截的请求
location /my_project/ {
    # http://127.0.0.1:8080/ 是访问没有配置content-path的,项目默认访问路径
    proxy_pass http://127.0.0.1:8080/;

    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:

http://your-ip-address:port/my_project/

第二步:访问这个路径会通过nginx代理一步,然后访问到项目默认访问路径,假设这个路径会重定向一个页面

return "redirect:/demo/hello.html"

第三步:这个重定向请求的url反应到代理上面就变成了

http://your-ip-address:port/demo/hello.html

看这个链接就会发现, my_project 被nginx识别拦截的标识经过重定向之后没有了,所以也就找不到页面了。

不同于前后端分离项目,前端的请求会一直携带着能被nginx识别的标识进行访问。

举例2:配置上项目的content-path,再使用ngxin代理

content-path配置如下

nginx 复制代码
server:
  port: 8080
  servlet:
    context-path: /my-project

添加content-path后nginx.conf配置修改如下

nginx 复制代码
# my_project是nginx会识别拦截的请求
location /my_project/ {
    # http://127.0.0.1:8080/my_project 是访问配置了content-path的,项目默认访问路径,代理效果同例1
    proxy_pass http://127.0.0.1:8080/my_project;

    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:

http://your-ip-address:port/my_project/

第二步:访问这个路径会通过nginx代理一步,然后访问到项目默认访问路径,假设这个路径会重定向一个页面

#还是重定向到相同的页面

return "redirect:/demo/hello.html"

第三步:这个重定向请求的url反应到代理上面就变成了

http://your-ip-address:port/my_project/demo/hello.html

为什么最后重定向的地址会多一个my_project

因为前后端不分离的项目在进行请求重定向的时候会携带自身的content-path的值,拼接到请求域名的后面,所以当域名携带着my-project这个能被nginx识别的url标识符的时候,就会再次被nginx拦截,从而访问到项目资源。

总结

  1. 前后端不分离的项目在进行请求重定向和请求转发的时候,会携带自身的content-path值,拼接到域名后面。
  2. 前后端不分离的项目nginx拦截url关键字要和content-path值保持一致。

如果不保持一致会发生什么?重定向之后通过代理还是访问不到资源。

假设content-path配置为:

yaml 复制代码
server:
  port: 8080
  servlet:
    context-path: /project

nginx配置为:

nginx 复制代码
# my_project是nginx会识别拦截的请求
location /my_project/ {
    # http://127.0.0.1:8080/my_project 是访问配置了content-path的,项目默认访问路径,代理效果同例1
    proxy_pass http://127.0.0.1:8080/project;

    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:

http://your-ip-address:port/my_project/ # 正常访问到nginx

第二步:访问这个路径会通过nginx代理一步,然后访问到项目默认访问路径,假设这个路径会重定向一个页面

#还是重定向到相同的页面

return "redirect:/demo/hello.html"

第三步:这个重定向请求的url反应到代理上面就变成了

#发现缺少了能让nginx拦截的url关键字,访问不到资源了

http://your-ip-address:port/project/demo/hello.html

相关推荐
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
还是大剑师兰特1 天前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
AI职业加油站1 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏1 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
xing-xing1 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅1 天前
linux(8) 软硬链接
linux·运维·服务器
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
布裘1 天前
【银河麒麟】V4桌面图标消失,右击鼠标没反应排查
运维·银河麒麟·桌面环境
懂软件的胡子个哥1 天前
微信机器人为什么需要“回复候选”而不是所有 AI 内容直接发送
运维·微信·自动化·wechatapi·个人微信号二次开发