栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

1. 起因

最近使用php做一个小项目,需要在后台获取 post 数据并进行处理。

网站文件结构如下:

web
├─test
│  └─index.php

index.php


前端请求时发现获取不到 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 重定向

  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. 参考资料
  • 用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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849934.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号