我应该用Symfony做一个跨域的API。有什么包吗?我试过FOS休息包,但似乎没有解决我的问题。
xoshrz7s1#
我建议你使用NelmioCorsBundle:https://github.com/nelmio/NelmioCorsBundle此捆绑包允许您使用ACL样式的每个URL配置发送跨域资源共享标头。对于CORS问题非常有用
2q5ifsrm2#
我使用了Symfony 5和Wordpress文件中的这段代码public/index.php工作得很好。
Symfony 5
Wordpress
public/index.php
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 ..这个捆绑包不适合我
cors
tv6aics13#
我不确定这是不是正确的方法,但我决定:1.创建新的事件订阅者(如ResponseSubscriber)1.监听KernelEvents::RESPONSE事件1.在处理程序中添加以下内容:
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 ; }
n8ghc7c14#
https://github.com/nelmio/NelmioCorsBundle或如果你想自己编写一个cors包,这里有一些提示:
例如,在一些配置yaml文件中管理你的Origin cors列表。如果它匹配你的cors列表,则验证HTTP_ORIGIN。然后将HTTP_ORIGIN作为“VALID”发送回去。Access-Control-Allow-Origin: THE_HTTP_ORIGIN_HERE
Access-Control-Allow-Origin: THE_HTTP_ORIGIN_HERE
TLDR;不要仅仅使用通配符就轻视cors,在一个糟糕的cors实现中,每个攻击者站点都可以从您的用户中获取活动会话。
受害者浏览器,不可能通过javascript发送伪造的HTTP_ORIGIN。
uqjltbpv5#
在提供NelmioCorsBundle文档中提到的静态文件时要小心。在PHP/应用程序级别配置。这很方便,但也意味着任何服务于静态文件且不通过Symfony的请求都不会添加CORS头,因此如果您需要为静态文件提供CORS,您可能应该在Web服务器中配置这些头对于那些使用Api platform和caddy server的人。可以使用header指令编辑Caddyfile,为Access-Control-Allow-Origin设置默认值
header
Caddyfile
Access-Control-Allow-Origin
header ?Access-Control-Allow-Origin "http://localhost:3000"
你也可以使用env var:.env
.env
WEB_APP_URL=http://localhost:3000
header ?Access-Control-Allow-Origin "{$WEB_APP_URL}"
5条答案
按热度按时间xoshrz7s1#
我建议你使用NelmioCorsBundle:
https://github.com/nelmio/NelmioCorsBundle
此捆绑包允许您使用ACL样式的每个URL配置发送跨域资源共享标头。
对于CORS问题非常有用
2q5ifsrm2#
我使用了
Symfony 5
和Wordpress
文件中的这段代码public/index.php
工作得很好。另外,我删除包
cors
..这个捆绑包不适合我tv6aics13#
我不确定这是不是正确的方法,但我决定:
1.创建新的事件订阅者(如
ResponseSubscriber
)1.监听
KernelEvents::RESPONSE
事件1.在处理程序中添加以下内容:
n8ghc7c14#
https://github.com/nelmio/NelmioCorsBundle
或
如果你想自己编写一个cors包,这里有一些提示:
例如,在一些配置yaml文件中管理你的Origin cors列表。如果它匹配你的cors列表,则验证HTTP_ORIGIN。然后将HTTP_ORIGIN作为“VALID”发送回去。
Access-Control-Allow-Origin: THE_HTTP_ORIGIN_HERE
最后,这与https://github.com/nelmio/NelmioCorsBundle使用的工作流程基本相同。我的建议:保护你的时间)
TLDR;不要仅仅使用通配符就轻视cors,在一个糟糕的cors实现中,每个攻击者站点都可以从您的用户中获取活动会话。
受害者浏览器,不可能通过javascript发送伪造的HTTP_ORIGIN。
uqjltbpv5#
提供静态文件
在提供NelmioCorsBundle文档中提到的静态文件时要小心。
在PHP/应用程序级别配置。这很方便,但也意味着任何服务于静态文件且不通过Symfony的请求都不会添加CORS头,因此如果您需要为静态文件提供CORS,您可能应该在Web服务器中配置这些头
对于那些使用Api platform和caddy server的人。
可以使用
header
指令编辑Caddyfile
,为Access-Control-Allow-Origin
设置默认值你也可以使用env var:
.env
Caddyfile