1. 起因
最近使用php做一个小项目,需要在后台获取 post 数据并进行处理。
网站文件结构如下:
web
├─test
│ └─index.php
index.php
<?php
var_dump($_POST);
var_dump($_GET);
?>
前端请求时发现获取不到 post 参数:
post 参数竟然为空!!!
2. 经过
在一番百度之后,尝试了各种方法,包括
- 更改 php 配置文件,允许 post 上传数据
- 更改 php 配置文件,允许上传文件
- 更改 php 配置文件,将最大上传大小修改为 100 MB
后端依然获取不到 post 参数。
在花费了几天时间查询大量资料后,依然没有解决问题。就在快要抓狂的时候,后端突然可以获取到 post 参数了:
不对呀,我什么也没有做啊,为什么突然就好了。这时候,我突然注意到了地址栏的 URL:
果然,在去掉末尾的 / 后,又获取不到 post 参数了,但这是为什么呢?
3. 原因
3.1 URL 规范
在一番查找后,我发现了下面的资料:
从 URL 地址的规范来说,末尾带斜杠 / 的是目录, 不带的是文件,是两个不同的地址。
即 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. 参考资料
|