Laravel 和 Dcat Admin 在使用 Nginx 进行 Uri 二级目录的反向代理时遇到的问题以及解决方法
文章目录
- 问题
- 解决方法
- 改进
问题
一般的 Laravel 应用进行 Nginx 的 Uri 二级目录反向代理的时候,Nginx 的配置文件可按如下配置
location /prefix/ {set $suffix "";if ($uri = /index.php) {set $suffix /;}proxy_http_version 1.1;proxy_set_header Host $http_host;proxy_set_header Scheme $scheme;proxy_set_header SERVER_PORT $server_port;proxy_set_header REMOTE_ADDR $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;proxy_pass http://127.0.0.1:8000/;
}
由于我们在 proxy_pass
中的 Url 末尾添加了 /
,所以 Laravel 在收到请求时,请求的路径不包含反向代理的前缀 /prefix
,即若用户所见的地址为:
http://xxxx.xxxx/prefix/index
Laravel 收到的请求地址将会是:
http://xxxx.xxxx/index
这样就可以让反向代理层对 Laravel 应用透明,但是会出现这样的问题,就是 url()
等函数生成的路径将会是不含反向代理前缀的路径,造成 asset()
等函数均生成错误的地址,为了解决这样的问题,我们可以在 AppServiceProvider
类中的 boot
方法添加以下内容:
app('url')->forceRootUrl(config(app.url));
这样的话,url()
将会基于 .env
文件中提供的 APP_URL
值设置所生成的 url 的根路径。我们只需在 .env
中配置 APP_URL
即可
APP_URL=http://xxxx.xxxx/prefix/
经过这样的配置,对于一般的 Laravel 应用已经可以实现二级目录的反向代理,但实际上很多项目中生成 url 的地方并非都使用 url()
函数生成,比如今天要说的 Dcat Admin,它的源代码中同时使用了 $request
的 url 和 url()
生成的 url 。如在生成菜单项时使用了 url()
函数而在获取当前资源路径时,当 $request
提供的 url
合法的话又是直接使用请求的地址。
这就导致我们在使用上面的的配置的时候,会出现这样的情况:
- 点击菜单栏跳转到
/prefix/xxx
之后,地址栏会自动变成/xxx
,刷新后变成了 404; - “创建”、“提交”按钮提供的是不带
prefix
的链接,导致 404
解决方法
在上述配置的基础上,在 admin.php
中将后台的路径配置为 /prefix/admin
,然后再在 Nginx 的配置文件中添加:
location /prefix/admin/ {set $suffix "";if ($uri = /index.php) {set $suffix /;}proxy_http_version 1.1;proxy_set_header Host $http_host;proxy_set_header Scheme $scheme;proxy_set_header SERVER_PORT $server_port;proxy_set_header REMOTE_ADDR $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;proxy_pass http://127.0.0.1:8000;
}
注意这里面 proxy_pass
末尾没有添加 /
,Laravel 接收到请求时将会保有 /prefix/admin
当我们这样配置时,Dcat Admin 会生成两种 url,一种是 /prefix/prefix/admin/
(使用 url()
函数生成的),一种是 /prefix/admin/xxx
(直接从请求的 url 中获取的)。
当访问 /prefix/prefix/admin/
时,会被 Nginx 中的 location /prefix/
捕获,Laravel 应用收到的 Uri 不带 /prefix
,即 /prefix/admin
,按照我们在 admin.php
中的配置,此时请求成功被 Dcat Admin 捕获并处理。
当访问 /prefix/admin/xxx
时,会被 Nginx 中的 location /prefix/admin/
中捕获,此时 Laravel 收到的请求会保有 /prefix/admin
,此时请求成功被 Dcat Admin 捕获并处理。
改进
暂时没有改进的思路,还望各位大佬指点。
Laravel 和 Dcat Admin 在使用 Nginx 进行 Uri 二级目录的反向代理时遇到的问题以及解决方法相关推荐
- nginx配置二级目录,反向代理不同ip+端口
场景描述: 通过二级目录(虚拟目录,应用程序)的方式访问同一ip+端口的不同应用,例如location是用户使用页面,location/admin/是管理页面,location部署在192.168.1 ...
- nginx产生【413 request entity too large】错误的原因与解决方法
nginx产生[413 request entity too large]错误的原因与解决方法 参考文章: (1)nginx产生[413 request entity too large]错误的原因与 ...
- ServletUriComponentsBuilder遇到Nginx反向代理时,无法识别HTTPS
前言 spring mvc 5.2.9.RELEASE springboot 2.3.4.RELEASE ServletUriComponentsBuilder遇到Nginx反向代理时,无法识别HTT ...
- 【Nginx那些事】nginx配置实例(一)反向代理
[Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...
- nginx 反向代理时丢失端口的解决方案(转)
nginx 反向代理时丢失端口的解决方案(转) 参考文章: (1)nginx 反向代理时丢失端口的解决方案(转) (2)https://www.cnblogs.com/shenyixin/p/1136 ...
- Nginx四层代理和7层反向代理
Nginx四层代理和7层反向代理 文章目录 Nginx四层代理和7层反向代理 Nginx四层代理配置 Nginx四层代理配置步骤 配置好两台Nginx七层代理服务器 在四层代理的Nginx服务器上做相 ...
- 解决 nginx 反向代理时 session 丢失 无效的问题
解决 nginx 反向代理时 session 丢失 无效的问题 原文 blog.csdn.net/joyous/article/details/79966593 因为原始路径和代理路径发生了变化,导致 ...
- 使用Nginx为TCP/WebSocket协议做反向代理和几个易踩的坑
通常,我们使用Nginx为后端WEB服务做反向代理或负载均衡,但如果我们的后端服务,并不是HTTP/HTTPS协议,而是TCP协议或WebSocket协议呢 最近遇到一个需求,我们的HTTPS以及MQ ...
- Nginx基础学习笔记(正向/反向代理,Nginx均衡负载和配置)
目录 1. 正向代理和反向代理 1.1 正向代理 (1)什么是正向代理? (2)正向代理的特点 (3)正向代理的用途 1.2 反向代理 (1)什么是反向代理? (2)反向代理的特点 (3)反向代理的用 ...
最新文章
- 【PP生产订单】入门介绍(九)
- 华为被上汽狂DISS:智能驾驶时代车企呼唤“主权”?
- OpenCV_008-OpenCV 中的图像算术运算
- 最新任务型对话数据集大全
- 基于Doxygen的C/C++注释原则
- 9600kf功耗和温度评测_谁更受主流消费者青睐:AMD锐龙5 3500X对比英特尔酷睿i5-9600KF...
- pandas 下的 one hot encoder 及 pd.get_dummies() 与 sklearn.preprocessing 下的 OneHotEncoder 的区别
- java文件的打包和解包,Java包装类:什么是包装类对象,什么是打包和解包,当编译遇到自动打包和解包时会发生什么?...
- vue 下载文档乱码
- java list 冒泡_JAVA List 排序 冒泡排序
- 评论:中国网络游戏虚拟物品交易的前景
- excel从两列数据中找到相同的数据,并用不同颜色展示
- 产品设计- 需求分析
- 【STM32学习笔记-03】ESP8266 访问心知天气API获取实时天气信息
- torch.Tensor详解
- 解决Chaquopy在AS中pip安装过慢的问题
- 工作3年的Java程序员如何成功跳槽,7K一飞到22K
- dayjs Timezone 设置默认时区
- 求一元二次方程的根 java
- kubectl describe pod Error from server (NotFound):pods not found