预检请求未通过访问控制检查
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 框架,但现在输出缓冲解决方案就像一个绝对的魅力。非常感谢。以上是关于预检请求未通过访问控制检查的主要内容,如果未能解决你的问题,请参考以下文章