1. 起因
最近使用php做一个小项目,需要在后台获取 post 数据并进行处理。
网站文件结构如下:
web
├─test
│ └─index.php
index.php
<?php
var_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