预检请求未通过访问控制检查

Posted

技术标签:

【中文标题】预检请求未通过访问控制检查【英文标题】:Preflight request doesn't pass access control check 【发布时间】:2019-12-29 08:17:06 【问题描述】:

尝试从我的 Angular 8 Web 应用程序发出 JWT 授权的 json rest api 请求,但它给出了上述错误。已遵循所有合理的 CORS 配置步骤,然后将规则放宽到仍然无法正常工作的程度,我已向你们寻求帮助。

所以就 CORS 配置而言,在我开始的 php 方面:

header("Access-Control-Allow-Origin: http://localhost:4200");
header("Content-Type: application/json;charset=utf-8");
header("Access-Control-Allow-Methods: OPTIONS, GET, PUT, POST, DELETE");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

我把事情放慢了一点:

header("Access-Control-Allow-Origin: *");
header("Content-Type: *");
header("Access-Control-Allow-Methods: *");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: *");

但后来我在 CORS 文档中读到 Access-Control-Allow-Headers 不允许 *,所以我恢复了该行。

目前我有:

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json, text/plain, */*");
header("Access-Control-Allow-Methods: OPTIONS, GET, PUT, POST, DELETE");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, X-Requested-With, Authorization");

我得到的错误是:

访问 XMLHttpRequest 在 'http://localhost/api/controllers/asset.php/' 来自原点 'http://localhost:4200' 已被 CORS 策略阻止:响应 :它没有 HTTP 正常状态。

这是来自调试工具 (Chrome) 中网络选项卡的请求的标头信息。

显示临时标题 Accept: application/json, text/plain, / 授权:承载 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOm51bGwsImF1ZCI6IlRIRV9BVURJRU5DRSIsImlhdCI6MTU2NjYyOTIxNywibmJmIjoxNTY2NjI5MjE5LCJleH....已编辑

这是在 apache 上运行 php 7.2

我希望新的宽松 CORS 设置能够正常工作,但我仍然收到此错误。

如何调整 CORS 设置以满足飞行前请求?

【问题讨论】:

检查您的broeser开发者工具中的网络标签。您应该看到一个带有“OPTIONS”方法的请求,这是预检请求。从上面的错误看来,这个请求没有得到 HTTP ok 响应 【参考方案1】:

我创建了一个名为Willow 的框架。这是我使用的code,它可以克服 CORS 的疯狂。

    $requestMethod = $_SERVER['REQUEST_METHOD'];

    // Is this a pre-flight request (the request method is OPTIONS)? Then start output buffering.
    if ($requestMethod === 'OPTIONS') 
        ob_start();
    

    // Allow for all origins and credentials. Also allow GET, POST, PATCH, and OPTIONS request verbs
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers');
    header('Access-Control-Allow-Methods: GET, POST, PATCH, OPTIONS, DELETE');

    // If this is a pre-flight request (the request method is OPTIONS)? Then flush the output buffer and exit.
    if ($requestMethod === 'OPTIONS') 
        ob_end_flush();
        exit();
    

HTH

【讨论】:

这正是答案。我会怀着浓厚的兴趣来看看你的 Willow 框架,但现在输出缓冲解决方案就像一个绝对的魅力。非常感谢。

以上是关于预检请求未通过访问控制检查的主要内容,如果未能解决你的问题,请参考以下文章

“对预检请求的响应未通过访问控制检查”是啥意思?

对预检请求的响应未通过访问控制检查

对预检请求的响应未通过访问控制检查

对预检请求的响应未通过访问控制检查

CORS:对预检请求的响应未通过访问控制检查:预检请求不允许重定向

GraphQL 网关`预检请求未通过访问控制检查`