无框架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]
注意事项
- 确保Apache开启重写模块:打开XAMPP的
httpd.conf文件,找到LoadModule rewrite_module modules/mod_rewrite.so,去掉行首的#注释,重启Apache服务 .htaccess需放置在正确目录(项目根目录或api/目录)- 测试前清除Postman的缓存,避免旧的301重定向缓存干扰结果
内容的提问来源于stack exchange,提问作者redystum
相关产品推荐
相关产品推荐

