【踩坑日记 · Web】一个斜杠引发的悲剧

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/testhttp://localhost/test/ 是两个不同文件。

3.2 重定向

请添加图片描述

  1. 前端请求 http://localhost/test
  2. 服务器发现没有这个文件,重定向到 http://localhost/test/重点就这这里)。

    我使用的服务器软件是 Nginx,而 Nginx 默认情况下重定向的状态码是301,不会携带请求体

  3. 前端重新请求 http://localhost/test/

3.3 解决方法

3.3.1 加上 /

请求时在 URL 后面加上 /,这是最简单也是最有效的解决方法。

3.3.2 更改服务器配置

将服务器的重定向代码改为 307,307 重定向可以携带原请求体等数据。

4. 参考资料

猜你喜欢

转载自blog.csdn.net/qq_34802028/article/details/124544356