domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

Posted

技术标签:

【中文标题】domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态【英文标题】:domain.com has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status 【发布时间】:2021-09-16 19:47:20 【问题描述】:

现在处理从 React 应用程序到 Symfony 的预检请求变得太困难了,我在过去 8 小时内试图解决这个问题,这是我得到的错误,

Access to XMLHttpRequest at 'https://mylocaldomain.com/validate-token' from origin 'http://myreactapplocal:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

我尝试在 public/index.php 中的here 中添加这篇文章中的代码并且它有效,我正在尝试在侦听器中实现相同的代码,因为我不想编辑 public/index.php 并且它是无法通过监听器工作,下面是我的监听器代码



namespace App\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\KernelEvents;

class CorsListener implements EventSubscriberInterface



    private $container;

    public function __construct(ContainerInterface $container)
    
        $this->container = $container;
    

    public static function getSubscribedEvents(): array
    
        return [
            RequestEvent::class => 'onRequestEvent',
            ResponseEvent::class => 'onResponseEvent',
        ];
    


    public function onRequestEvent(RequestEvent $event)
    
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) 
            return;
        

        $request = $event->getRequest();
        $method  = $request->getRealMethod();
        if ('OPTIONS' === $method) 
            $response = new Response();
            $response->headers->set('Access-Control-Allow-Headers', 'X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method,Access-Control-Request-Headers, Authorization');
            $event->setResponse($response);
        
    

    public function onResponseEvent(ResponseEvent $event)
    
        // Don't do anything if it's not the master request.
        if (!$event->isMasterRequest()) 
            return;
        
        $response = $event->getResponse();
        $response->headers->set('Access-Control-Allow-Origin', '*');
        $response->headers->set('Access-Control-Allow-Methods', 'GET,POST,PUT,OPTIONS,PATCH,DELETE');
        $response->headers->set('Access-Control-Allow-Headers', 'Content-Type,Authorization');
    


感谢任何帮助/导致解决此问题的方法!

【问题讨论】:

你检查过这个捆绑包github.com/nelmio/NelmioCorsBundle吗?或者这个bundle的监听者github.com/nelmio/NelmioCorsBundle/blob/master/EventListener/… 是的,我浏览了这个包,不幸的是,我无法在我们的项目中安装,原因它需要 composer 2 而我们需要 composer 1.10,因为我们的项目有一些依赖。我查看了他们的 CorsListener,他们返回了相同的参数,Access-Control-Allow-Methods、Access-Control-Request-Headers 和 Access-Control-Allow-Origin。这是我直接在我的听众中添加的。 您是否通过在不使用您的应用程序(例如使用浏览器或 Postman)的情况下发出简单请求来检查您的侦听器是否正常工作。你能检查你的监听器是否已注册和配置器bin/console debug:event-dispatcher OR debug:container 嗨@qdequippe 谢谢,是的,我尝试使用邮递员添加转储语句它的打印,我尝试了调试容器,我的侦听器已注册,当我尝试转储时,我可以看到我的变量印刷。但是现在我尝试在 index.php 和 corslistener 中打印响应,我在这里发现了一个不同之处,即版本,当我在 index.php 中添加标头时,它会将版本添加为 1.1,但是当我在 corslistener 中执行相同操作时,它默认为1.0,你认为这可能是问题吗? 版本是什么意思?您确定 index.php 中的代码没有覆盖您的侦听器吗? 【参考方案1】:

我在使用 angular 和 symfony 时也遇到了这个问题

对我来说,将以下代码放在index.php 上解决了它

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: *");
header("Access-Control-Allow-Methods: *");
header("Allow: *");
$method = $_SERVER['REQUEST_METHOD'];
if ($method === "OPTIONS") 
    die();

【讨论】:

嗨@thomas 感谢您的回答,但我不想修改 index.php,想将其设置为侦听器的一部分或某处但不作为 index.php 的一部分。跨度>

以上是关于domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs——对 XMLHttpRequest 的访问已被 CORS 策略阻止 [重复]

http://localhost:4200' 已被 CORS 策略阻止:对预检请求的响应未通过

已被 CORS 策略阻止:对预检请求的响应未通过

使用反应返回 405 错误获取快速后端(来自原点'null'已被 CORS 策略阻止:对预检等的响应......)

套接字 IO 错误“对 XMLHttpRequest 的访问已被 CORS 策略阻止”

来源已被 CORS 策略阻止 对预检请求的响应未通过访问控制检查