Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony Ajax同源策略_Ajax_Symfony_Cross Domain_Same Origin Policy - Fatal编程技术网

Symfony Ajax同源策略

Symfony Ajax同源策略,ajax,symfony,cross-domain,same-origin-policy,Ajax,Symfony,Cross Domain,Same Origin Policy,我正在尝试从域127.0.0.1:8000向localhost:8000发送一个AJAX请求。这通电话以一个短消息结束 状态代码:405方法不允许 我添加了一个侦听器,该侦听器正在为源问题发送正确的标题: <?php namespace AppBundle\Listener; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; /** * Class CorsListener is handling on Kern

我正在尝试从域127.0.0.1:8000向localhost:8000发送一个AJAX请求。这通电话以一个短消息结束

状态代码:405方法不允许

我添加了一个侦听器,该侦听器正在为源问题发送正确的标题:

<?php

namespace AppBundle\Listener;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

/**
 * Class CorsListener is handling on Kernel response header actions
 * @package AppBundle\Listener
 */
class CorsListener {
    public function onKernelResponse(FilterResponseEvent $event) {
        $request = $event->getRequest();

        // allow this only for the tracking URL
        /*if(strpos($request->getHost(), 'api.') === false) {
            return;
        }*/
        $event->getResponse()->headers->set('Access-Control-Allow-Headers', 'origin, content-type, accept');
        $event->getResponse()->headers->set('Access-Control-Allow-Origin', '*');
        $event->getResponse()->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE OPTIONS');
    }
}

您似乎缺少一个逗号

$event->getResponse()->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE OPTIONS');
应该是

$event->getResponse()->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');

DELETE
OPTIONS
是两种不同的方法。

我必须在我的Symfony控制器中允许OPTIONS方法:

* @Method({"GET", "POST", "OPTIONS"})

PHP代码需要显式处理选项请求。仅在访问控制允许方法响应头值中包含“选项”是不够的。头值的唯一作用是在浏览器中的客户端。问题出在服务器端,与CORS头配置无关。您需要有明确的代码来处理选项请求;该代码只需要发送一个200 OK响应,其中包括您已经配置的标题(添加了缺少的逗号,如下所述)。请尝试此操作。我认为这仍然是Symfony的最佳解决方案。我同意NelmioCorsBundle使安装变得非常简单。顺便说一句:我现在有2个对服务器的请求。一个用于选项,一个用于发布。这是对的吗?在你自己的帖子上发表评论,不通知其他人^^^我将回答可能读到以下内容的人:是的,这是正常的,选项调用只是在执行实际调用方法之前先查找选项。