Yii2框架原生PHP表单提交未跳转指定action反而跳转首页
问题根因
Yii2框架完全支持原生PHP表单编写,提交后重定向到首页和是否使用框架自带表单组件无关,核心触发原因是Yii2默认全局开启CSRF跨站请求伪造防护:所有未携带合法CSRF令牌的POST请求,都会被框架默认拦截,直接重定向到站点首页,不会进入对应的控制器动作。
你当前编写的原生表单没有携带Yii2要求的CSRF校验参数,因此请求被拦截。
解决方案
方案1(推荐,不降低安全等级)
在原生form表单内部添加Yii2自动生成的CSRF隐藏字段,和框架自带表单生成的校验参数完全一致,可正常通过校验。
在<form>标签内、其他表单项之前加入如下代码即可:
<input type="hidden" name="<?= Yii::$app->request->csrfParam ?>" value="<?= Yii::$app->request->getCsrfToken() ?>">
修改后的完整表单示例:
<form action="/syllabus/lms/index" method="post"> <input type="hidden" name="<?= Yii::$app->request->csrfParam ?>" value="<?= Yii::$app->request->getCsrfToken() ?>"> Author : <input type="text" name="author" placeholder="Author's Name" /> <br><br> Number of published Article : <input type="number" name="num_article" placeholder="Published Article" /> <br><br> <input type="submit" name="submit" value="Submit"> </form>
方案2(仅适用于无需CSRF防护的场景,如公开回调接口)
单独为对应控制器的index动作关闭CSRF校验,禁止全局关闭CSRF防护,否则会引入严重安全风险。
在对应的LmsController控制器中加入如下代码:
public function beforeAction($action) { if ($action->id === 'index') { $this->enableCsrfValidation = false; } return parent::beforeAction($action); }
额外排查点
- 确认pretty URL配置的路由规则正确,
/syllabus/lms/index可正常解析到对应控制器的index动作,避免因路由匹配失败跳转首页。 - 原生代码直接读取
$_POST取参可以正常运行,更推荐使用框架请求组件获取POST参数:Yii::$app->request->post('参数名'),框架会自动做参数过滤,安全性更高。
内容的提问来源于stack exchange,提问作者Rahm
相关产品推荐
相关产品推荐

