【问题标题】:Symfony 4, CORS and OPTION requestsSymfony 4,CORS 和 OPTION 请求
【发布时间】: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 状态响应?

【问题讨论】:

    标签: php symfony cors symfony4


    【解决方案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,因为它是相同的来源)
      猜你喜欢
      • 2019-07-24
      • 2019-06-26
      • 2013-02-13
      • 2021-09-05
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2019-06-29
      相关资源
      最近更新 更多