尽管端点在 apicontroller 内部的行为中使用了 cors 类,但 CORS 标头未添加到响应中

Posted

技术标签:

【中文标题】尽管端点在 apicontroller 内部的行为中使用了 cors 类,但 CORS 标头未添加到响应中【英文标题】:CORS headers not being added to the response despite endpoint using cors class in behaviors inside apicontroller 【发布时间】:2020-05-07 07:46:15 【问题描述】:

我遇到了一个问题,即 CORS 标头未添加到响应中。我正在使用包中的“cors”\yii\filters\Cors

基本上,我正在这样做:

class ApiController extends ActiveController

    public function behaviors()
    
        return array_merge(parent::behaviors(), [
            // For cross-domain AJAX request
            'corsFilter' => [
                'class' => 'yii\filters\Cors',
                'cors' => [
                    'Origin' => ['*'], // Restrict access to domains
                    'Access-Control-Max-Age' => 3600, // Cache (seconds)
                    'Access-Control-Allow-Origin' => true,
                    'Access-Control-Expose-Headers' => ['*'],
                    'Access-Control-Request-Headers' => ['*'],
                    'Access-Control-Allow-Credentials' => true,
                    'Access-Control-Request-Method' => ['POST', 'HEAD', 'DELETE', 'PUT', 'GET', 'OPTIONS'],
                ],
            ],
        ]);
    

而且我仍然得到与不应用此方法相同的结果。没有 CORS 标头添加到我的端点的OPTIONS 查询的响应中。

还有其他人遇到过这个问题吗?

【问题讨论】:

我试过你的代码,效果很好! 【参考方案1】:

您也可以尝试允许来源:

    public static function allowedDomains()
        
            return [
                // '*',                        // star allows all domains
                'http://localhost:4200',
            ];
           

  public function behaviors()
        
            return array_merge(parent::behaviors(), [

                // For cross-domain AJAX request
                'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'stats' => ['GET'],
                        ],
                    ],
                'corsFilter' => [
                    'class' => \yii\filters\Cors::className(),
                    'cors' => [
                        // restrict access to domains:
                        'Origin' => static::allowedDomains(),
                        'Access-Control-Request-Method' => ['POST', 'GET', 'DELETE', 'PUT', 'OPTIONS'],
                        'Access-Control-Allow-Credentials' => true,
                        'Access-Control-Allow-Headers' => ['*'],
                        'Access-Control-Allow-Origin' => ['*'],
                        'Access-Control-Max-Age' => 3600, // Cache (seconds)
                    ],

                ],
            ]);
        

【讨论】:

以上是关于尽管端点在 apicontroller 内部的行为中使用了 cors 类,但 CORS 标头未添加到响应中的主要内容,如果未能解决你的问题,请参考以下文章

为啥尽管 web.ignoring().antMatchers() 仍然在此端点上调用我的过滤器? [复制]

无法到达控制器中的端点,尽管它已被初始化

Swagger 版本控制不起作用。它显示所有端点,尽管选择了 API 版本

骆驼路线和端点

带有 Protobuf-net 的端点行为配置 WCF

“尝试调用控制器端点时无法将JSON值转换为System.String”