Yii2首页验证码图片不显示,直接访问controller/captcha链接可正常加载
问题根因
你页面上的验证码默认请求的是site/captcha接口,但你仅验证过tracking/captcha可以正常访问,大概率是site/captcha接口存在权限拦截或者配置问题,导致图片资源返回异常。
解决方案
方案1(更简单,直接使用Tracking控制器自带的验证码)
修改两处配置即可:
- 修改Tracking模型的验证规则,指定验证码动作指向当前控制器的captcha:
// app\models\Tracking public function rules() { return[ ['verifyCode', 'captcha', 'captchaAction' => 'tracking/captcha'] ]; }
- 视图渲染验证码部件时,显式指定验证码动作,避免默认走site控制器:
// 视图页面 <?= $form->field($model, 'verifyCode')->widget(Captcha::class, [ 'captchaAction' => 'tracking/captcha', 'options' => [ 'placeholder' => 'Enter the letters above', 'class' => 'form-control', ] ])->label('')?>
方案2(继续使用Site控制器的验证码)
需修复Site控制器的权限规则:AccessControl的规则是从上到下匹配,未登录用户访问site/captcha时,会先匹配第一条要求登录角色的规则,匹配失败才会走后面的访客规则,容易被父类控制器的自定义拦截逻辑影响,建议将公共可访问的captcha规则放在最前面,同时允许登录和未登录用户访问:
// frontend\controllers\SiteController public function behaviors() { return [ 'access' => [ 'class' => \yii\filters\AccessControl::className(), 'rules' => [ // 验证码规则放最优先 [ 'actions' => ['captcha'], 'allow' => true, 'roles' => ['?', '@'], ], [ 'actions' => ['index', 'support', 'error', 'systemdoc', 'contact'], 'allow' => true, 'roles' => ['client1', 'client2', 'client3', 'client4', 'client5', 'client6', 'client7','api', 'clientmanager', 'clientmanager2', 'clientsupervisor', 'clientbeta','3pl4pl'], ], [ 'actions' => ['api'], 'allow' => true, 'roles' => ['api'], ], ], ], ]; }
排查验证
修改后刷新页面,查看验证码img标签的src是否和你之前可正常访问的路径一致,直接复制src地址到浏览器地址栏访问,确认可以返回验证码图片即可。
补充:如果修改后仍然无法访问,可检查父类
AccessController中是否有自定义的beforeAction权限拦截逻辑,将captcha动作加入拦截白名单即可。
内容的提问来源于stack exchange,提问作者Hunter Bertoson
相关产品推荐
相关产品推荐

