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

PHP REST API无法识别PUT/POST/DELETE请求方法求助

问题解决:PHP REST API非GET请求被识别为GET

问题根源

你的问题出在.htaccess规则顺序与Apache目录索引机制的冲突上:

  • 当请求localhost/api/notes时,第二条规则将其重定向到src/api/notes(这是一个目录)
  • Apache默认的目录索引(DirectoryIndex)会自动加载该目录下的index.php,但这个内部跳转过程会把POST/PUT/DELETE请求强制转换成GET方法
  • 当你把文件名改成非index.php时,Apache不会触发目录索引的自动跳转,请求方法就能正常传递

修复方案

方案1:调整Rewrite规则顺序并明确指向index.php

修改.htaccess,把API路由规则放在最前面,直接指定到目标目录的index.php,避免目录索引干扰:

RewriteEngine On

# 优先处理API路由,直接指向对应目录的index.php
RewriteRule ^api/(.*)$ src/api/$1/index.php [QSA,L]

# 处理其他非API的PHP文件重写
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

方案2:禁用目标目录的目录索引

在Src/Api/Notes/目录下新建.htaccess文件,添加以下内容禁止Apache自动加载index.php:

DirectoryIndex disabled

这种方式需要你访问时明确指定文件名(比如localhost/api/notes/your-file.php),适合不想修改主.htaccess的场景。

方案3:针对性处理API目录请求

如果想保留原URL结构,也可以在主.htaccess中添加规则,专门处理API目录的请求:

RewriteEngine On

# 匹配API目录请求,直接加载对应目录的index.php
RewriteRule ^api/([^/]+)/?$ src/api/$1/index.php [QSA,L]

# 处理其他非API的PHP文件重写
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

验证方法

修改后用POST/PUT/DELETE请求localhost/api/notes,检查$_SERVER['REQUEST_METHOD']是否能正确返回对应请求方法即可。

内容的提问来源于stack exchange,提问作者Đức Hà Việt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:22:40