远程服务器上的 YII 2 REST CORS 问题

问题描述 投票:0回答:2

我开发了一个 Yii2 REST API 应用程序。本地一切正常。 我已将应用程序部署到远程服务器。我可以通过 Postman 获得 api 响应。但是,当我尝试使用 AJAX 或 Angular 发出请求时,我收到“预检响应具有无效的 HTTP 状态代码 401”错误。 我的控制器行为()方法:

public function behaviors() {

    return array_merge(parent::behaviors(), [


        $behaviors['corsFilter']  = [
            'class' => \yii\filters\Cors::className(),
            'cors'  => [
                // restrict access to domains:
                'Origin'                           => ['*'],
                'Access-Control-Request-Method'    => ['GET','POST','PUT','DELETE','OPTIONS'],
                'Access-Control-Request-Headers' => ['*'],
                'Access-Control-Allow-Credentials' => true,
                'Access-Control-Max-Age'           => 3600,                 // Cache (seconds)
            ],
        ],
        $behaviors['authenticator'] = [
            'class' => AvnrHttpBasicAuth::className(),
        ],

    ]);
}

响应和请求标头:

enter image description here

enter image description here

enter image description here

我认为这是 CORS 问题,但我无法弄清楚为什么这在使用 apache 的 Centos 上运行的远程服务器上不起作用。

我扩展了 HttpBasicAuth 并使用我自己的 AvnrHttpBasicAuth 类

class AvnrHttpBasicAuth extends HttpBasicAuth
{
    public function authenticate($user, $request, $response)
    {

        $authHeader = $request->getHeaders()->get('Authorization');

        if ($authHeader !== null && preg_match("/^Basic\\s+(.*?)$/", $authHeader, $matches)) {

            $identity = $user->loginByAccessToken($matches[1], get_class($this));

            if ($identity === null) {
                $this->handleFailure($response);
            }
            return $identity;
        }
        return null;
    }
}
php ajax yii2 cors basic-authentication
2个回答
1
投票

您需要为预检请求添加例外,如官方文档中所示:

$behaviors['authenticator'] = [
    'class' => AvnrHttpBasicAuth::className(),
    'except' => ['options']
],

预检请求由浏览器在需要时处理/发出。例如,当前端和后端托管在不同的域中并且您正在发出 POST 请求时,浏览器需要先发送 OPTIONS 请求以查看是否允许 POST,然后再发送真正的请求。要从 POSTMAN 测试它,您需要发送 OPTIONS 请求而不是 POST/PUT。


1
投票

我通过对 .htaccess 文件进行少量修改解决了这个问题。 感谢这篇帖子

.htaccess 文件中下面的这两行就成功了。

RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
Header always set Access-Control-Allow-Origin "*"
© www.soinside.com 2019 - 2024. All rights reserved.