我应该使用Symfony创建跨域API。是否有相关的bundle可用?
我已经尝试了FOS Rest Bundle,但似乎没有解决我的问题。
我应该使用Symfony创建跨域API。是否有相关的bundle可用?
我已经尝试了FOS Rest Bundle,但似乎没有解决我的问题。
我建议您使用NelmioCorsBundle:
https://github.com/nelmio/NelmioCorsBundle
该Bundle允许您使用ACL样式的每个URL配置发送跨源资源共享标头。
对于CORS问题非常有用。
我在文件public/index.php
中使用了Symfony 5
和WordPress
,这段代码完美运行。
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Allow: GET, POST, OPTIONS, PUT, DELETE");
$method = $_SERVER['REQUEST_METHOD'];
if ($method == "OPTIONS") {
die();
}
另外,我移除了cors
包。这个扩展包对我没有用。
Access-Control-Allow-Credentials
而不是Access-Control-Allow-Origin
头部。据我所知,将Access-Control-Allow-Origin
头部设置为适当的值不会引起任何安全问题。 - undefined我不确定这是正确的方法,但是我已经为自己解决了:
ResponseSubscriber
)KernelEvents::RESPONSE
事件if ($event->getRequest()->getMethod() === 'OPTIONS') {
$event->setResponse(
new Response('', 204, [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type',
'Access-Control-Max-Age' => 1728000,
'Content-Type' => 'text/plain charset=UTF-8',
'Content-Length' => 0
])
);
return ;
}
https://github.com/nelmio/NelmioCorsBundle
或者
如果你想为自己编写一个CORS包,这里有一些提示:
+其他的访问控制头。了解更多深入信息请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS。
在NelmioCorsBundle文档中提到提供静态文件时要小心。
配置在PHP/应用程序级别。这很方便,但也意味着任何请求提供静态文件而不经过Symfony的请求都不会添加CORS标头,因此,如果您需要为静态文件提供CORS,则最好在Web服务器中配置这些标头。
对于那些使用Api platform和caddy server的人来说。
您可以使用header
指令编辑您的Caddyfile
,以设置Access-Control-Allow-Origin
的默认值。
header ?Access-Control-Allow-Origin "http://localhost:3000"
您也可以使用环境变量:
.env
WEB_APP_URL=http://localhost:3000
Caddyfile
header ?Access-Control-Allow-Origin "{$WEB_APP_URL}"