我一直试图弄清楚为什么我刚刚部署到Apache服务器的Symfony 4 API应用程序遇到了CORS问题,
config / packages / nelmio_cors.yaml
nelmio_cors:
defaults:
origin_regex: true
allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
allow_headers: ['Content-Type', 'Authorization']
max_age: 3600
paths:
'^/': ~
.env
...
CORS_ALLOW_ORIGIN=/*/
...
我从localhost
前端应用程序对该API发出的请求的所有响应均不包含Access-Control-Allow-Origin
标头,但出现标准错误;
从源访问“ http://my-api.com/foo”处的XMLHttpRequest “ http://localhost:4200”已被CORS政策屏蔽:对 预检请求未通过访问控制检查:否 请求中存在“ Access-Control-Allow-Origin”标头 资源。
没有发送特殊的标头,现在我已经将允许的源正则表达式设置为“ all”,所以我无法弄清楚导致此问题的原因。我什至在缓存中进行了检查,以确保已从env变量中正确提取了原点。如果需要其他上下文/文件内容来协助您,请告诉我!
答案 0 :(得分:0)
我总是尝试更加具体地允许CORS之类:
CORS_ALLOW_ORIGIN=^http://(.*:8080|localhost:4200)$
如果您真的想启用所有来源,可以尝试以下操作:
CORS_ALLOW_ORIGIN=^.*$
答案 1 :(得分:0)
您的问题是您选择使用正则表达式(origin_regex: true
),但未提供有效的模式。
如果要使用origin_regex: true
,则应指定有效模式,例如.*
或^.*$
。
如果您不想使用正则表达式,请省略origin_regex
设置(或将其设置为false
),而仅将*
用作您的CORS_ALLOW_ORIGIN
值
答案 2 :(得分:0)
我已经解决了该问题,尽管从表面上看它似乎与CORS配置有关,但实际上是服务器上项目的错误配置。
TL; DR表示该项目缺少一个.htaccess
文件,由于使用了Valet,我在开发中不需要该文件-按照说明here解决了该问题。
答案 3 :(得分:-2)
为什么需要nelmio?
您可以使用简单的事件监听器(在kernel.event_subscriber上)添加这些标头。
namespace App\EventListener\HttpKernel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
class CorsSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => 'onResponse'
];
}
public function onResponse(FilterResponseEvent $filterResponseEvent)
{
$response = $filterResponseEvent->getResponse();
$response->headers->set('Access-Control-Allow-Origin', '*');
}
}
将其注册为kernel.event_subscriber
app.http_kernel.cors_subscriber:
class: App\EventListener\HttpKernel\CorsSubscriber
tags:
- { name: kernel.event_subscriber }