nginx rewrite重写URL地址, laravel路由404问题

前言

在开发项目时,我面临一个需求:区分移动端和桌面端访问路径。移动端访问应在路径前加上/m/,而桌面端则不需要。例如:

  • 移动端: 域名/m/路由地址
  • 桌面端: 域名/路由地址

这种设计在路由规则上带来了一定的重复,因为相同的处理逻辑需要为两种不同的路径配置。例如,原始PHP路由配置如下:

# 不加上m写一次规则
Route::get('/register', 'Auth\RegisterController@showRegistrationForm');
# 加上m写一次规则
Route::get('/m/register', 'Auth\RegisterController@showRegistrationForm');

这导致代码重复,为了解决这个问题,我决定通过Nginx的地址重写功能来优化。

Nginx 配置
我在Nginx配置文件中添加了以下规则,以实现地址重写:

server {listen        93;server_name  localhost;root   "F:/project/work/gameWeb/public/";location /m/ {rewrite ^/m/(.*)$ /$1 last;    }location / {index index.php index.html error/index.html;try_files $uri $uri/ /index.php$is_args$args;autoindex  off;}location ~ \.php(.*)$ {fastcgi_pass   127.0.0.1:9002;fastcgi_index  index.php;fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;fastcgi_param  PATH_INFO  $fastcgi_path_info;fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;fastcgi_param  REQUEST_URI        $request_uri;}
}

尽管Nginx重写规则看似有效,但最终仍返回了Laravel的404页面,说明路由匹配失败。

结论与解决方案

问题出在以下这行配置:

fastcgi_param  REQUEST_URI $request_uri;

在PHP中,$_SERVER[‘REQUEST_URI’] 获取的是重写前的URL,而不是重写后的。意味着即使URL被重写为不含 /m/ 的路径,REQUEST_URI 仍然包含 /m/。

为了验证这一点,我将上述行修改为:

fastcgi_param  REQUEST_URI "/register";

这样,访问 域名/m/register 时,路由规则能成功匹配到:

Route::get('/register', 'Auth\RegisterController@showRegistrationForm');

这表明Laravel的路由匹配实际上是依赖于 REQUEST_URI 的值。因此,要解决这个问题,我觉得不是在于Nginx规则要改写REQUEST_URI,因为这会影响所有的项目。

最终解决方案

在 app\Providers\RouteServiceProvider.php 的代码文件中,修改boot方法
通过加入前缀路由的方式,来去除/m/带来的404问题

public function boot(){$this->configureRateLimiting();$this->routes(function () {Route::prefix('api')->middleware('api')->namespace($this->namespace)->group(base_path('routes/api.php'));Route::middleware('web')->namespace($this->namespace)->group(base_path('routes/web.php'));// 不加m的路由Route::namespace('App\User\Controller')->group(base_path('routes/user.php'));// 加了m的路由,将m视为前缀Route::prefix('m')->namespace('App\User\Controller')->group(base_path('routes/user.php'));});}

补充知识点

框架 laravel/yii2 使用 $_SERVER[‘request_uri’] 中的路径做路由解析,不受rewrite影响
框架 thinkphp 使用 $_SERVER[‘path_info’] 中的路径做路由解析,受rewrite影响
两者最大的不同在于,nginx的rewrite重写后,获取到的路径是截然不同的

在 URL 重写(Rewrite)后的差异

  • REQUEST_URI 变化:当使用 URL 重写(如在 Apache 的 .htaccess 或 Nginx 的 rewrite 规则)时,REQUEST_URI 通常会保持不变,反映原始请求的 URI。
  • PATH_INFO 变化:PATH_INFO 可能会受到 URL 重写的影响。如果 URL 被重写到一个特定的脚本,PATH_INFO 可能会反映重写后的路径。

所以
thinkphp采用nignx的rewrite重写来实现去除/m/的影响理论上可行
但是laravel、YII则不能使用这种方案

这里博主没有去进行测试了

这篇文章可以看看:https://segmentfault.com/a/1190000022499679#item-8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#]使用OpenCvSharp实现二维码图像增强超分辨率

【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 借助于opencv自带sr.prototxt和sr.caffemodel实现对二维码图像增强 【效果展示】 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin…

【机器学习】循环神经网络(一)

一、网络结构 RNN 处理输入序列时的信息流。 粗体箭头为各时间点信息流的活跃路径,虚线箭头显示当时不活动的连接。 一个简单RNN例子 RNN 不是一类网络,而是适用于不同问题的拓扑结构的集合。循环网络的一个有趣的方面是,有了足够的层和节点&…

export命令详解

export命令详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一同深入了解 Linux 和 Unix 系统中的一个强大命令——export,并…

PC+Wap仿土巴兔装修报价器源码 PHP源码

核心功能: 业主自助预算计算:通过简洁的界面,业主可以输入装修需求,系统自动进行预算计算信息自动收集:系统自动收集业主的基本信息,如姓名、联系方式、房屋面积等一键发送报价:业主完成预算计…

GnuTLS recv error (-110): The TLS connection was non-properly terminated.

bug 解决方案:参考 GnuTLS recv error (-110): The TLS connection was non-properly terminated. 解决方案: apt-get install gnutls-bin git config --global http.sslVerify false git config --global http.postBuffer 1048576000参考

【SpringCloud】7、Spring Cloud Gateway限流配置

1、限流介绍 Spring Cloud Gateway 的限流配置主要涉及到令牌桶算法的实现。令牌桶算法可以对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 在 Spring Cloud Gateway 中,官方提供了 RequestRateLimiterGatewayFi…

uni-app 前后端调用实例 基于Springboot 上拉分页实现

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

Grafana相关问题及答案(2024)

1、Grafana 是什么,它用于什么目的? Grafana 是一个高度灵活且富有功能的数据可视化和监控平台,旨在为技术专业人员提供强大的方式来显示和分析他们的数据。下面将详细介绍 Grafana 的关键特点和它的使用场景。 关键特点 1. 数据源的多样性…

【数据库系统概论】数据库并发控制机制——并发操作带来的数据不一致性问题有哪些

系统文章目录 数据库的四个基本概念:数据、数据库、数据库管理系统和数据库系统 数据库系统的三级模式和二级映射 数据库系统外部的体系结构 数据模型 关系数据库中的关系操作 SQL是什么?它有什么特点? 数据定义之基本表的定义/创建、修改和…

算法基础之合并果子

合并果子 核心思想&#xff1a; 贪心 Huffman树(算法): 每次将两个最小的堆合并 然后不断向上合并 #include<iostream>#include<algorithm>#include<queue> //用小根堆实现找最小堆using namespace std;int main(){int n;cin>>n;priority_queue&l…

项目-苍穹外卖基础(持续更新中~)

day1: login的后端实现&#xff1a; day 2:

【java】期末复习知识点

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 填空题封装包主类开发过程的改变interfaceabstract class访问控制关键字继承多态object 类Java I/O(输入/输出)异常线程和进程创建线程的两种基本方法 编程题Hello World编写Swing程序&#xff0c;显示一个空白窗口 填空题…

【大数据进阶第三阶段之Hive学习笔记】Hive的数据类型与数据操作

【大数据进阶第三阶段之Hive学习笔记】Hive安装-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive常用命令和属性配置-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive基础入门-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive查询、函数、性能优化-CSDN博客 …

奇偶数合并

今天分享一道很有意思的算法题目 1、题目描述 奇偶数合并 将所有相邻且相同的偶数相加放入相邻偶数中间 将所有相邻且相同奇数相加&#xff0c;替换掉这两个相邻且相同的奇数 最后输出合并后的数组结果。 举例 数组[1,2,2,7,8,3,3,6] 数组奇偶数合并之后[1,2,4,2,7,8,6,1…

互联网大厂面试题目

阿里篇 1.1.1 如何实现一个高效的单向链表逆序输出&#xff1f; 1.1.2 已知sqrt(2)约等于1.414&#xff0c;要求不用数学库&#xff0c;求sqrt(2)精确到小数点后10位 1.1.3 给定一个二叉搜索树(BST)&#xff0c;找到树中第 K 小的节点 1.1.4 LRU缓存机制 1.1.5 关于epoll和…

依次判断数组a中的每个字符串长度 是否小于等于数组b中对应字符串长度 numpy.char.less_equal(a,b)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 依次判断数组a中的每个字符串长度 是否小于等于数组b中对应字符串长度 numpy.char.less_equal(a,b) [太阳]选择题 请问以下代码最终输出结果是&#xff1f; import numpy as np a np.array…

初探ElasticSearch

1.什么是ElasticSearch&#xff1f; ElasticSearch简称ES&#xff0c;也成为弹性搜索&#xff0c;是基于Apache Lucene构建的开源搜索引擎。其实Lucene本身就是一款性能很好的开源搜索引擎工具包&#xff0c;但是Lucene的API相对复杂&#xff0c;而且掌握它需要很深厚的“内功…

通过使用别名让 SQL 更简短-数据库教程shulanxt.com-帆软软件有限公司

MySQL视频教程导航 https://www.shulanxt.com/database/mysqlvideo/p1 SQL 别名 SQL 别名 通过使用 SQL&#xff0c;可以为表名称或列名称指定别名。 基本上&#xff0c;创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法 SELECT column_name AS alias_name FROM …

Linux操作实例 – 输入输出重定向

Linux操作实例 – 输入输出重定向 Input & Output Redirection Examples in Linux By Jackson 1. 前言 在操作计算机的时候&#xff0c;我们能够很容易通过键盘、鼠标给计算机输入信息&#xff08;例如&#xff1a;写公文、邮件&#xff0c;同时通过显示器得到输出。这就…

DevOps(4)

目录 16.Ctrl Alt Del组合键是否适用于Linux&#xff1f; 17.如何引用连接打印机等设备的并行端口&#xff1f; 18.硬盘驱动器和软盘驱动器等驱动器是否用驱动器号表示&#xff1f; 19.如何在Linux下更改权限&#xff1f; 20.在Linux中&#xff0c;为不同的串口分配了哪些…