PHP(Yii2)AngularJS的CORS问题

Posted

技术标签:

【中文标题】PHP(Yii2)AngularJS的CORS问题【英文标题】:CORS issue with PHP (Yii2) AngularJS 【发布时间】:2019-02-04 01:27:14 【问题描述】:

不断收到 cors 问题。 已经尝试过以下方法:

    在yii2中添加你可以在图片中看到的代码 已在 Firefox 中安装了 Cors 插件

API 网址:http://thisisbig.ae/advanced/backend/web/customersapi/update/?id=2

【问题讨论】:

thisisbig.ae/advanced/backend/web/customersapi/update/?id=2 以 405 “方法不允许。该 URL 只能处理以下请求方法:PUT、PATCH”。它需要用 200 OK 来响应 OPTIONS 请求。问题中显示的错误消息表明失败的是浏览器自动发送的 CORS preflight OPTIONS 请求。 @sideshowbarker - 好的,但我已将“选项”放在“访问控制允许方法”中 是的,仅将“选项”放在“访问控制允许方法”值中是不够的。需要明确的是,您将其设置在http://thisisbig.ae/advanced/backend/web/customersapi/update/ 服务器后端,对吗?那是你的服务器,你控制它的配置? @sideshowbarker - 是的,我愿意 您是否已将corsFilter 行为附加到您的控制器? 【参考方案1】:

在后端 ( Yii2 ) 中,需要重写控制器中的 verbs() 函数并为 'update' 值添加 'OPTIONS'

protected function verbs()

    return [
        'index' => ['GET', 'HEAD'],
        'view' => ['GET', 'HEAD'],
        'create' => ['POST'],
        'update' => ['PUT', 'PATCH','OPTIONS'],
        'delete' => ['DELETE'],
    ];
 

【讨论】:

【参考方案2】:

使用行为来定义它

public function behaviors()

    return [
        'verbs' => [
            'class' => \yii\filters\VerbFilter::className(),
            'actions' => [
                'index'  => ['GET'],
                'view'   => ['GET'],
                'create' => ['GET', 'POST'],
                'update' => ['GET', 'PUT', 'POST'],
                'delete' => ['POST', 'DELETE'],
            ],
        ],
    ];
 

您还可以通过将 CORS 过滤器作为行为附加到控制器或模块来使用它,如下所示,

public function behaviors()

    return [
        'corsFilter' => [
            'class' => \yii\filters\Cors::className(),
        ],
    ];

你也可以使用 CORS 过滤器来限制参数,像这样,

public function behaviors()

    return [
        'corsFilter' => [
            'class' => \yii\filters\Cors::className(),
            'cors' => [
                // restrict access to
                'Origin' => ['http://www.myserver.com', 'https://www.myserver.com'],
                // Allow only POST and PUT methods
                'Access-Control-Request-Method' => ['POST', 'PUT'],
                // Allow only headers 'X-Wsse'
                'Access-Control-Request-Headers' => ['X-Wsse'],
                // Allow credentials (cookies, authorization headers, etc.) to be exposed to the browser
                'Access-Control-Allow-Credentials' => true,
                // Allow OPTIONS caching
                'Access-Control-Max-Age' => 3600,
                // Allow the X-Pagination-Current-Page header to be exposed to the browser.
                'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
            ],

        ],
    ];

【讨论】:

以上是关于PHP(Yii2)AngularJS的CORS问题的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 和 Silex 的 CORS 问题(PHP - Apache)

AngularJS,PHP Restful Cors 问题

angularjs + PHP应用程序中的CORS错误

在 POST 请求中使用 Angular 和 Yii2 的 CORS 错误

Yii2 和 reactjs CORS 过滤器给出错误:预检响应具有无效的 HTTP 状态代码 401

AngularJS中的CORS错误