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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:51:07