【问题标题】:Yii2 CORS inserts two recordsYii2 CORS 插入两条记录
【发布时间】:2016-03-30 16:45:12
【问题描述】:

我正在使用 Yii2 构建一个 API,并启用了 CORS 过滤器来处理来自正在运行的 Web 前端的请求。

但是,由于飞行前的 OPTIONS 请求和真正的 POST 请求,我将两条记录添加到数据库中,每个请求一条。我原以为 Yii 应该接受 OPTIONS 请求,返回正确的标头然后退出。为什么它实际上会处理完整的请求?

我现在正在通过将其添加到控制器操作的顶部来解决这个问题:

if(Yii::$app->request->getMethod() == 'OPTIONS') {
    return;
}

这是最好的方法还是我错过了什么?

【问题讨论】:

  • 在 CORS 中,您应该使用 'Access-Control-Request-Headers' => ['Expiry'] 以继续您的算法。
  • 您的urlManager::rules 是如何配置的?以及您是如何设置 CORS 过滤器的?默认情况下,yii\rest\UrlRule 会将任何 OPTIONS 动词重定向到 yii\rest\OptionsAction,该作用仅提供已接受动词的列表。因此,使用默认配置不可能将 OPTIONS 动词视为 POST。也许一个错误的 OPTIONS 答案是让前端重新发送 POST 请求。请显示更多代码并在浏览器的网络选项卡中查看已发送请求的有序列表。
  • 这似乎不再是问题了。一旦发送了 CORS 标头,更高版本的 Yii 将退出脚本。

标签: ajax yii2 cors


【解决方案1】:

这应该是错误的,因为浏览器需要options 响应才能知道他可以发送的允许的动词列表。否则可能会引发 401 错误。其源码可见here

class OptionsAction extends \yii\base\Action
{
    public $collectionOptions = ['GET', 'POST', 'HEAD', 'OPTIONS'];
    public $resourceOptions = ['GET', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];

    public function run($id = null)
    {
        if (Yii::$app->getRequest()->getMethod() !== 'OPTIONS') {
            Yii::$app->getResponse()->setStatusCode(405);
        }
        $options = $id === null ? $this->collectionOptions : $this->resourceOptions;
        Yii::$app->getResponse()->getHeaders()->set('Allow', implode(', ', $options));
    }
}

这就是它所做的一切:在响应标头中发送允许的动词列表。

由于意外响应,客户端脚本可能已发送两次 POST 请求。尝试应用我在您的其他问题中发布的答案。我认为它也会解决这个问题:

Yii2 CORS with Auth not working for non CRUD actions.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多