【踩坑日记 · Web】一个斜杠引发的悲剧
1. 起因
最近使用php做一个小项目,需要在后台获取 post 数据并进行处理。
网站文件结构如下:
web
├─test
│ └─index.php
index.php
<?phpvar_dump($_POST);var_dump($_GET);
?>
前端请求时发现获取不到 post 参数:
URL: http://localhost/test
get参数: get = get_data
post参数: post = post_data
响应内容:
post 参数竟然为空!!!
2. 经过
在一番百度之后,尝试了各种方法,包括
- 更改 php 配置文件,允许 post 上传数据
- 更改 php 配置文件,允许上传文件
- 更改 php 配置文件,将最大上传大小修改为 100 MB
后端依然获取不到 post 参数。
在花费了几天时间查询大量资料后,依然没有解决问题。就在快要抓狂的时候,后端突然可以获取到 post 参数了:
不对呀,我什么也没有做啊,为什么突然就好了。这时候,我突然注意到了地址栏的 URL:
果然,在去掉末尾的 /
后,又获取不到 post 参数了,但这是为什么呢?
3. 原因
3.1 URL 规范
在一番查找后,我发现了下面的资料:
从 URL 地址的规范来说,末尾带斜杠
/
的是目录, 不带的是文件,是两个不同的地址。
对于服务器来说,如果访问目录,则会根据规则访问改目录下的默认文件(如: index.php index.html)。
如访问
/abc/
服务器会寻找abc/index.html
文件,而访问/abc
服务器则会寻找abc
文件。
即 http://localhost/test
和 http://localhost/test/
是两个不同文件。
3.2 重定向
- 前端请求
http://localhost/test
。 - 服务器发现没有这个文件,重定向到
http://localhost/test/
(重点就这这里)。
我使用的服务器软件是 Nginx,而 Nginx 默认情况下重定向的状态码是301,不会携带请求体。
- 前端重新请求
http://localhost/test/
。
3.3 解决方法
3.3.1 加上 /
请求时在 URL 后面加上 /
,这是最简单也是最有效的解决方法。
3.3.2 更改服务器配置
将服务器的重定向代码改为 307,307 重定向可以携带原请求体等数据。
4. 参考资料
- 用301重定向给网站更换新域名POST丢失 - SegmentFault 思否:https://segmentfault.com/q/1010000007026578
- 网址后面加”/“与不加斜杠有什么区别? – 教程与解决方案 | Fuyeor Docs:https://docs.fuyeor.com/answer/5178.html
- 切尔诺贝尔的博客-CSDN博客:https://blog.csdn.net/weixin_40580582/article/details/102967419
- Nginx http重定向到https时,post请求变为get的问题 - 谭普利特 - 博客园:https://www.cnblogs.com/Template/p/9442913.html
【踩坑日记 · Web】一个斜杠引发的悲剧相关推荐
- 踩坑日记之Springfox+Kotlin lateinit引发NullPointException
文章目录 相关技术栈 起因 分析 1. 报错位置 2. 接口定义 3. Kotlin编译成Java 4. springfox源码分析 1. 判断是否加了`@RequestBody`等参数 2. 包装` ...
- silverlight Image Source URI : 一个反斜杠引发的血案
silverlight Image Source URI : 一个反斜杠引发的血案 Silverlight2 现在支持的Image格式有jpg和png,部分png编码也不支持,同时有些png在xaml ...
- 全志哪吒D1-H Tina Linux Ubuntu 22.04入门踩坑日记
哪吒D1-H Tina Linux入门踩坑日记 系统环境 源码编译 mklibs-readelf的C++标准问题 m4的SIGSTKSZ问题 libfakeroot的_STAT_VER问题 read_ ...
- Win11 + Ubuntu18.04 双系统踩坑日记
Win11 + Ubuntu18.04 双系统踩坑日记 前言 准备工作 硬件配置 镜像下载 Win11镜像下载 Ubuntu镜像下载 启动盘准备 Win11启动盘 Ubuntu启动盘 Win11安装 ...
- ReactNative 在丁香医生项目中引入的踩坑日记
ReactNative 在丁香医生项目中引入的踩坑日记 this没绑定到函数导致空指针 参考 React-Native 踩坑第二弹-undefined is not a function(evalua ...
- springboot踩坑日记—nacos: Error watching Nacos Service change
springboot踩坑日记-nacos: Error watching Nacos Service change Spring Boot :: (v2.1.5.RELEASE) 错误代码: 07-3 ...
- c++字符串操作之std::ostringstream踩坑日记
c++字符串操作之std::ostringstream踩坑日记 在开发过程中经常会遇到字符串操作,而std::string又没有format操作,这就很难受了. 于是我找到了std::ostrings ...
- Antd Pro V4 protable详解(ps:踩坑日记)
Antd Pro V4 protable详解(ps:踩坑日记) 写在前面: 在这篇文章中,你会了解到: protable 中的cloumns属性详解 protable数据加载和处理(两种方法,直接使用 ...
- 关于我使用vant组件的踩坑日记
啦啦啦~~~又是晴朗的一天~今天用vue+vant组件写h5移动端项目需要使用的到一个Actionsheet 弹窗,就是想实现一个这shai的效果: 当我悠哉悠哉的翻阅文档,哎~找到了我想要的 然后我 ...
最新文章
- Yann LeCun主讲!纽约大学《深度学习》2021课程全部放出,附slides与视频
- ruby安装插件报错
- 使用坚果云同步SVN服务器数据
- 服务器被黑给我上了一课
- MySQL--4操作数据表中的记录小结
- android开发标签栏应该设置多少钱,android – Flutter:刷卡后默认标签栏控制器......
- csharp添加引用路径_(2)添加path
- Servlet的生命周期和工作原理
- 广实1592: 1.6-06:校门外的树
- sed截取连接数升高时的慢日志
- 当系统出错,win10真难用
- php 5分钟前,PHP实现时间轴函数(刚刚、5分钟前)
- 穿山甲(巨量引擎)广告接入
- 区块链钱包,新一代支付宝?|筱静观察
- mysql my.cnf位置_我如何找到MySQL my.cnf位置
- 头文件里应该写些什么
- 使用shiro+aop实现权限控制
- 计算机中z代表啥子意思,ctrl z英文是什么意思
- 事务四大特性(ACID)原子性、一致性、隔离性、持久性
- IP分片、TCP分段
热门文章
- 【智能优化算法】基于花朵授粉算法求解单标目优化问题附matlab代码
- availableProcessors is already set to [8], rejecting [8]
- 查询销售便携式电脑但不销售PC的厂商
- 阿里云体验有奖:如何将 PolarDB-X 与大数据等系统互通
- java libpcap,Linux搭建jpcap libpcap环境
- 计算机网络-多路复用
- 男人女人都应该知道的网络黑话大全
- 在不重启Linux服务器的情况下在线识别新添加的磁盘
- [评论随笔]大唐二李——初唐名将李靖、李勣评传(zhuan tianya)
- 关于with open() as f读取文件时编码报错问题