CodeIgniter REST_Controller中POST请求被识别为GET的问题
问题原因分析与解决方案
这种POST请求被识别成GET的情况,我之前在用CodeIgniter的REST_Controller时也碰到过,大概率是下面几个原因之一:
1. 请求被服务器重定向导致方法变更
最常见的触发场景和URL末尾的斜杠有关:
- 如果你请求的是
http://localhost/auth/login(不带末尾斜杠),而服务器默认配置(比如Apache的mod_dir模块开启了DirectorySlash On)会自动把这个请求重定向到带斜杠的http://localhost/auth/login/。 - 按照HTTP协议规范,浏览器或HTTP工具在处理这类重定向时,会自动把原POST请求转换成GET请求,最终到达控制器的自然是GET请求,也就触发了
login_get()方法。
验证方式:直接在RESTED插件里请求带末尾斜杠的URL http://localhost/auth/login/,看是否能正常触发login_post()。
解决办法:
- 统一使用带末尾斜杠的请求URL;
- 修改Apache配置或项目根目录的
.htaccess,添加内部重写规则避免重定向(不会改变请求方法):RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ $1/ [L]
2. .htaccess的Rewrite规则错误
如果你的.htaccess里的Rewrite规则配置不当,可能会丢失请求方法信息或者错误处理请求。确保使用CodeIgniter的标准Rewrite规则:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
额外的错误参数或标记可能会导致请求方法被篡改。
3. REST_Controller配置或版本问题
检查你使用的REST_Controller版本是否存在已知bug,比如旧版本在部分服务器环境下的请求方法检测逻辑有问题。同时可以查看application/config/rest.php里的配置:
- 如果
$config['enable_emulate_request']被错误开启,且你的请求中不小心携带了值为GET的_method参数,也会导致请求方法被模拟成GET。
4. 服务器环境的请求头传递问题
部分服务器(比如Nginx)或安全模块(如mod_security)的配置可能没有正确传递REQUEST_METHOD头。可以临时在控制器里添加代码排查:
public function login_post() { var_dump($_SERVER); echo('post'); }
如果打印出的REQUEST_METHOD确实是GET,说明请求到达服务器时就已经是GET,问题出在服务器配置或请求发送环节。
内容的提问来源于stack exchange,提问作者Thiago Bittencourt
相关产品推荐
相关产品推荐

