文章目录

  • 问题
  • 解决方法
  • 改进

问题

一般的 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 二级目录的反向代理时遇到的问题以及解决方法相关推荐

  1. nginx配置二级目录,反向代理不同ip+端口

    场景描述: 通过二级目录(虚拟目录,应用程序)的方式访问同一ip+端口的不同应用,例如location是用户使用页面,location/admin/是管理页面,location部署在192.168.1 ...

  2. nginx产生【413 request entity too large】错误的原因与解决方法

    nginx产生[413 request entity too large]错误的原因与解决方法 参考文章: (1)nginx产生[413 request entity too large]错误的原因与 ...

  3. ServletUriComponentsBuilder遇到Nginx反向代理时,无法识别HTTPS

    前言 spring mvc 5.2.9.RELEASE springboot 2.3.4.RELEASE ServletUriComponentsBuilder遇到Nginx反向代理时,无法识别HTT ...

  4. 【Nginx那些事】nginx配置实例(一)反向代理

    [Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...

  5. nginx 反向代理时丢失端口的解决方案(转)

    nginx 反向代理时丢失端口的解决方案(转) 参考文章: (1)nginx 反向代理时丢失端口的解决方案(转) (2)https://www.cnblogs.com/shenyixin/p/1136 ...

  6. Nginx四层代理和7层反向代理

    Nginx四层代理和7层反向代理 文章目录 Nginx四层代理和7层反向代理 Nginx四层代理配置 Nginx四层代理配置步骤 配置好两台Nginx七层代理服务器 在四层代理的Nginx服务器上做相 ...

  7. 解决 nginx 反向代理时 session 丢失 无效的问题

    解决 nginx 反向代理时 session 丢失 无效的问题 原文 blog.csdn.net/joyous/article/details/79966593 因为原始路径和代理路径发生了变化,导致 ...

  8. 使用Nginx为TCP/WebSocket协议做反向代理和几个易踩的坑

    通常,我们使用Nginx为后端WEB服务做反向代理或负载均衡,但如果我们的后端服务,并不是HTTP/HTTPS协议,而是TCP协议或WebSocket协议呢 最近遇到一个需求,我们的HTTPS以及MQ ...

  9. Nginx基础学习笔记(正向/反向代理,Nginx均衡负载和配置)

    目录 1. 正向代理和反向代理 1.1 正向代理 (1)什么是正向代理? (2)正向代理的特点 (3)正向代理的用途 1.2 反向代理 (1)什么是反向代理? (2)反向代理的特点 (3)反向代理的用 ...

最新文章

  1. 【PP生产订单】入门介绍(九)
  2. 华为被上汽狂DISS:智能驾驶时代车企呼唤“主权”?
  3. OpenCV_008-OpenCV 中的图像算术运算
  4. 最新任务型对话数据集大全
  5. 基于Doxygen的C/C++注释原则
  6. 9600kf功耗和温度评测_谁更受主流消费者青睐:AMD锐龙5 3500X对比英特尔酷睿i5-9600KF...
  7. pandas 下的 one hot encoder 及 pd.get_dummies() 与 sklearn.preprocessing 下的 OneHotEncoder 的区别
  8. java文件的打包和解包,Java包装类:什么是包装类对象,什么是打包和解包,当编译遇到自动打包和解包时会发生什么?...
  9. vue 下载文档乱码
  10. java list 冒泡_JAVA List 排序 冒泡排序
  11. 评论:中国网络游戏虚拟物品交易的前景
  12. excel从两列数据中找到相同的数据,并用不同颜色展示
  13. 产品设计- 需求分析
  14. 【STM32学习笔记-03】ESP8266 访问心知天气API获取实时天气信息
  15. torch.Tensor详解
  16. 解决Chaquopy在AS中pip安装过慢的问题
  17. 工作3年的Java程序员如何成功跳槽,7K一飞到22K
  18. dayjs Timezone 设置默认时区
  19. 求一元二次方程的根 java
  20. kubectl describe pod Error from server (NotFound):pods not found

热门文章

  1. verilog学习:加法器
  2. 精密塑胶模具生产1. 模架加工
  3. Shader入门精要读书笔记11
  4. Web前端开发工程师实战培训教程
  5. CCSA学习笔记 第一节 思科安全解决方案综述
  6. 使用poi实现excel的上传下载
  7. Windows如何用sha1验证文件完整性
  8. 微信小程序:全局路由登录拦截和分享参数过长的问题
  9. 机器人演唱邓丽君是真的吗_为什么说邓丽君唱功不好,将要过气。?
  10. BigDecimal加减乘除次方运算及比较大小