You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无框架PHP API问题:POST请求无尾斜杠时变为GET

问题:无末尾斜杠的文件夹POST请求被转为GET的解决方法

我正在开发一个不依赖框架的PHP API,遇到了以下问题:通过Postman向文件夹发送POST请求时,index.php中的$_SERVER['REQUEST_METHOD']返回值为GET。

文件夹结构

📂api
 ┗ 📂engine
    ┗ 📜index.php
    ┗ 📜history.php

具体现象

  • 向http://localhost/project/api/engine发送POST请求时,index.php中的$_SERVER['REQUEST_METHOD']显示为GET
  • 向http://localhost/project/api/engine/(末尾带斜杠)发送POST请求时,$_SERVER['REQUEST_METHOD']显示为POST

已尝试ChatGPT提供的.htaccess规则但无效,需要解决如何让无末尾斜杠的文件夹POST请求保持POST请求方法。

环境:Windows 11、XAMPP服务器、PHP 8.2.4


问题根源

Apache默认处理不带斜杠的目录请求时,会发送301永久重定向到带斜杠的版本。根据HTTP规范,POST请求经过301/302重定向后会被转为GET,这就是问题的核心。

解决方案

方案1:直接转发请求到index.php(避免重定向)

在项目根目录或api/目录下创建/修改.htaccess文件,添加以下规则:

# 开启重写引擎
RewriteEngine On

# 匹配不带斜杠的目录,直接转发到目录下的index.php
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ $1/index.php [L]
  • RewriteCond %{REQUEST_FILENAME} -d:校验请求路径是否为真实存在的目录
  • RewriteRule ^(.*[^/])$ $1/index.php [L]:将不带斜杠的目录请求直接指向该目录下的index.php,[L]表示终止后续规则处理

方案2:用307重定向保留POST方法

如果方案1不生效,可改用307临时重定向(HTTP规范规定307会保留原请求方法和请求体):

RewriteEngine On

# 对POST请求的无斜杠目录,用307重定向到带斜杠版本
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ $1/ [R=307,L]

注意事项

  1. 确保Apache开启重写模块:打开XAMPP的httpd.conf文件,找到LoadModule rewrite_module modules/mod_rewrite.so,去掉行首的#注释,重启Apache服务
  2. .htaccess需放置在正确目录(项目根目录或api/目录)
  3. 测试前清除Postman的缓存,避免旧的301重定向缓存干扰结果

内容的提问来源于stack exchange,提问作者redystum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:37:10