Symfony 4,CORS 和 OPTION 请求
Posted
技术标签:
【中文标题】Symfony 4,CORS 和 OPTION 请求【英文标题】:Symfony 4, CORS and OPTION requests 【发布时间】:2019-06-17 13:03:30 【问题描述】: 刚刚开始了一个新项目,使用 Symfony 4 作为 API,Vue 作为前端/应用程序。 Vue 开始抱怨 CORS,因此我开始发送所需的 CORS 标头 (Access-Control-Allow-Origin
)。
然后它开始说“预检响应没有 HTTP ok 状态。”。
我现在破解了我的 API 以强制状态代码始终为 200,但我正在寻找一个长期的解决方案。为什么我的 API(使用 Symfony 4 构建)没有以 OK 状态响应?
【问题讨论】:
【参考方案1】:由于预检请求使用 OPTIONS 请求方法,很可能您的网络服务器没有设置为开箱即用地支持它们 - 许多默认情况下仅支持 GET、POST 和 HEAD。
如果是这种情况,它可能就像更改标志以允许 OPTIONS 请求一样简单。好吧,还返回正确的 CORS 响应标头...
【讨论】:
【参考方案2】:你可以使用https://github.com/nelmio/NelmioCorsBundle -> 很容易配置
nelmio_cors:
defaults:
allow_credentials: false
allow_origin: []
allow_headers: []
allow_methods: []
expose_headers: []
max_age: 0
hosts: []
origin_regex: false
forced_allow_origin_value: ~
paths:
'^/api/':
allow_origin: ['*']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
'^/':
origin_regex: true
allow_origin: ['^http://localhost:[0-9]+']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
hosts: ['^api\.']
要手动响应,您可以阅读https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request中的定义
-> 它基本上表明一个 Option 请求将包含至少 3 个标头:
访问控制请求方法 访问控制请求标头 原产地要使请求成功,您必须通过返回并带有以下标头的空响应来响应此请求:
Access-Control-Request-Methods - 您允许的方法列表(即“POST、GET、OPTIONS”) Access-Control-Allow-Origin - 请求的来源如果应该拒绝 cors 请求,则为非 2xx 状态
【讨论】:
对。我已经看到了这一点,但我反对使用捆绑包来启用 CORS。 IMO 就像使用左键盘一样。 好的,那么这意味着您必须以 ok 状态响应预检请求,并返回您想要拥有的来源 + 您喜欢的标头 - 这就是捆绑包为您提供的所有内容。跨度> 没错。这就是我在这里想要做的。我只是不知道我应该写什么来以 OK 状态响应预检请求。 在理想情况下,您将通过与前端相同的域路由 api 请求(然后它们不需要 cors,因为它是相同的来源)以上是关于Symfony 4,CORS 和 OPTION 请求的主要内容,如果未能解决你的问题,请参考以下文章
CORS 错误:配置 Symfony 5 以接受 CORS 的正确方法是啥?
使用 Angular JS、cors 调用 symfony 2 rest api
在禁用调试模式的情况下对我的 Symfony 5 应用程序的 API 调用返回 CORS 错误
PHP/Symfony API 的 CORS 问题 Nelmio