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

Symfony3 / Nelmio cors / fetch api — 400 错误请求

.NET技术-4.0. NETCORE跨域