【发布时间】:2017-10-25 14:37:32
【问题描述】:
我正在尝试从域: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');
}
}
但是即使是headers,你可以在下图中看到,也不可能成为请求。
一些帮助?
【问题讨论】:
-
您的 PHP 代码需要显式处理 OPTIONS 请求。在 Access-Control-Allow-Methods 响应标头值中仅包含“OPTIONS”是不够的。标头值的唯一影响是在客户端,在浏览器中。您遇到的问题出在服务器端,与您的 CORS-headers 配置无关。您需要有明确的代码来处理 OPTIONS 请求;该代码只需要发送一个 200 OK 响应,其中包含您已经配置的标头(添加了缺少的逗号,如下所述)。
-
试试这个github.com/nelmio/NelmioCorsBundle。我认为这仍然是 Symfony 的最佳解决方案。
-
我同意 NelmioCorsBundle 的设置非常容易。
标签: ajax symfony cross-domain same-origin-policy