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

相关推荐
zzzhpzhpzzz5 分钟前
Ubuntu如何查看硬件型号
linux·运维·ubuntu
蜜獾云7 分钟前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
陌北v19 分钟前
Docker Compose 配置指南
运维·docker·容器·docker-compose
只会copy的搬运工30 分钟前
Jenkins 持续集成部署——Jenkins实战与运维(1)
运维·ci/cd·jenkins
娶不到胡一菲的汪大东1 小时前
Ubuntu概述
linux·运维·ubuntu
阿里嘎多学长1 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_1 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
灯火不休➴1 小时前
[Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)
linux·运维·服务器
小峰编程1 小时前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
张国荣家的弟弟2 小时前
【Yonghong 企业日常问题04】永洪BI可视化工具Linux部署全攻略(部署详解版)
linux·运维·github