Yii2:注销用户时不允许的方法(#405)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2:注销用户时不允许的方法(#405)相关的知识,希望对你有一定的参考价值。

我通过以下代码注销用户。这是我在注销按钮后面的视图代码:

<li>
   <a href="<?= Url::to(['site/logout'])?>">
    <i class="fa fa-sign-out"></i> Log out
   </a>
 </li>

我的控制器代码是:

public function actionLogout()
{
    Yii::$app->user->logout();

    $model = new LoginForm();
    $this->layout = 'index';
    return $this->render('login', ['model' => $model]);
}

在注销中它显示我:

方法不允许。此URL只能处理以下请求方法:POST。

它是什么?

答案

好像你有VerbFilter附加到你的logout SiteController行动:

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [            
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

这意味着此操作只能使用POST方法请求,并且您正在请求GET,这就是抛出异常#405的原因。

要么从VerbFilter中删除它,要么使用POST添加data-method属性来请求:

<a href="<?= Url::to(['site/logout'])?>" data-method="post">...</a>

更新:此问题的另一个原因可能是缺少yiiwebYiiAsset的依赖性。确保它包含在AppAsset中:

public $depends = [
    'yiiwebYiiAsset',
    ...
];

YiiAsset提供了data-method属性功能,通过编写更少的代码,可以将行为与行为post联系起来。没有资产,显然链接将充当常规链接,并将发送标准GET请求。

另一答案

你可以改变视图代码和echo而不是

<li>
   <a href="<?= Url::to(['site/logout'])?>">
    <i class="fa fa-sign-out"></i> Log out
   </a>
 </li>

这个:

    <?= html::a('<i class="fa fa-sign-out"></i>',
           ['/site/logout'],
           ['class'=>'btn btn-default btn-flat']), //optional* -if you need to add style
           ['data' => ['method' => 'post',]])
        ?>
另一答案

您只能用'logout'=> ['get']替换'logout'=> ['post']。这样你的错误就会得到解决。

这种方式仅适用于Yii Framework版本2。

另一答案

您还可以使用自定义模板

                     'items' => [
                        [
                            'label' => 'Logout',
                            'url' => ['/user/security/logout'],
                            'template' => '<a href="{url}" data-method="post">{label}</a>',
                        ],
                    ]
另一答案

如果您使用Nav::widget生成菜单,则注销项应指定linkOptions

[
  'label' => '<i class="fa fa-sign-out"></i>Logout',
  'url' => ['/logout'],
  'linkOptions' => ['data-method' => 'post'],
],
另一答案

下面的工作也假设你可能有额外的类和data-method属性。

<?= 
    Html::a(
        'Logout (' . Yii::$app->user->identity->username . ')', 
        ['/site/logout'], 
        ['class' => 'ui inverted button', 'data-method' => 'post']                
    );
?>  

以上是关于Yii2:注销用户时不允许的方法(#405)的主要内容,如果未能解决你的问题,请参考以下文章

YII 2,不允许的方法 (#405)

错误:(405) 将文件上传到 https 时不允许使用方法

错误 HTTP 状态 405 ?使用 GCP 负载平衡器时不允许的方法

discord.errors.HTTPException:405 方法不允许(错误代码:0):405:方法不允许

WCF REST 服务返回 405:jQuery AJAX GET 不允许的方法

如何打印错误 405 方法不允许用户使用