CodeIgniter Rest Extension API异常:PUT请求返回GET响应求助
问题分析与排查思路
看起来你的PUT请求被错误路由到了GET方法的处理函数,我来帮你梳理几个可能的原因和排查方向:
1. 跨域配置限制了PUT方法
你在__construct里设置了:
header("Access-Control-Allow-Methods: GET");
这个响应头明确告诉客户端只允许GET方法,虽然Postman可能不会严格拦截PUT请求,但这个设置可能干扰了REST库对请求方法的识别,或者导致服务器端的请求处理逻辑异常。
解决方案:把允许的方法改成包含PUT:
header("Access-Control-Allow-Methods: GET, PUT");
如果之后需要支持DELETE、POST等方法,也可以一并添加进去。
2. 服务器未启用PUT方法支持
很多服务器(比如Apache)默认禁用PUT、DELETE等非标准HTTP方法,会把这些请求自动转换为GET请求,这就会导致你的PUT请求实际被当作GET处理,自然返回index_get的响应。
排查与解决:
- 查看服务器的
access.log日志,确认请求记录里的方法是PUT还是GET,如果是GET,说明服务器把PUT转成了GET。 - 对于Apache,在项目根目录的
.htaccess文件中添加以下配置,允许PUT方法:
<Limit GET POST PUT DELETE> Allow from all </Limit>
同时确保你的重写规则正确传递请求方法,CodeIgniter默认的.htaccess配置如下(如果没有可以添加):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
3. CodeIgniter路由配置干扰
如果你在application/config/routes.php里自定义了路由,比如强制把provincias路由到index_get方法,那不管什么HTTP方法都会走这个函数。
排查:检查routes.php里是否有类似这样的配置:
$route['provincias'] = 'provincias/index_get';
如果有,删除这条路由,让REST库的自动路由规则生效——它会根据HTTP方法自动匹配_get/_put后缀的方法。
4. Postman请求设置错误
虽然可能性不大,但还是要确认你确实发送了PUT请求:
- 检查Postman顶部的方法选择器,确保选的是
PUT而不是GET。 - 打开Postman的「Console」(左下角),查看实际发送的请求详情,确认请求方法是
PUT,没有被篡改。
5. REST_Controller版本或初始化问题
如果以上都没问题,可能是REST库的版本兼容问题,或者初始化顺序导致的:
- 你在调用
parent::__construct();之前设置了header,虽然通常没问题,但可以尝试把header设置移到父类构造之后,看看是否解决:
public function __construct() { parent::__construct(); header("Access-Control-Allow-Methods: GET, PUT"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding"); header("Access-Control-Allow-Origin: *"); $this->load->database(); }
- 检查你的REST_Controller版本,是否是最新稳定版,旧版本可能存在方法匹配的bug,可以尝试更新到最新版。
内容的提问来源于stack exchange,提问作者Ari Waisberg
相关产品推荐
相关产品推荐

