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

博客讲述了作者在使用PHP开发时遇到的一个问题,即后端无法获取POST参数。问题源于URL末尾是否带斜杠导致的301重定向,301重定向在某些服务器配置下不携带请求体,从而导致POST数据丢失。解决方案包括在URL中添加斜杠或修改服务器配置为307重定向。这一问题涉及到URL规范、HTTP重定向和服务器配置知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 参考资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值