【问题标题】:Chrome gets HTTP 400 for CORS while CURL gets HTTP 200Chrome 为 CORS 获得 HTTP 400,而 CURL 获得 HTTP 200
【发布时间】:2017-04-14 18:44:32
【问题描述】:

我在用 Symfony 3 编写的简单 REST API 中使用 NelmioCorsBundle

在前端,我使用 dropzone.js 上传文件。上传 API 服务器的请求被拒绝,在控制台中我可以看到以下内容:“预检响应具有无效的 HTTP 状态代码 400”。但是,当我使用 CURL 发送完全相同的请求(使用 chrome Copy as cURL 实用程序)时,我得到 200。

虽然返回了 CORS 标头。我可以在我之前提到的回复中看到它们:

Access-Control-Allow-Headers:x-custom-auth
Access-Control-Allow-Methods:POST, PUT, GET, DELETE
Access-Control-Allow-Origin:https://example.com
Access-Control-Max-Age:3600

我无法使用 xdebug 对其进行调试,因为 Chrome 在请求 CORS 时不会发送 cookie。您还有其他想法如何为 CORS 标头启用 xdebug 吗?我可以尝试自己调试。

对于 NelmioCorsBundle,我根据他们的示例使用以下配置:

nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin:
            - '^admin\.project(\.|$)'
            - '^subdomain\.project\.(.*\.|)(lab|int|test|prep)\.nds$'
            - '~^subdomain\.project\.cz$'
        allow_headers: []
        allow_methods: []
        expose_headers: []
        max_age: 0
        hosts: []
        origin_regex: true
    paths:
        '^/':
            allow_origin: ['*']
            allow_headers: ['X-Custom-Auth']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
            max_age: 3600

最后 - project/var/log/*.log 中没有任何内容。

【问题讨论】:

    标签: cors symfony


    【解决方案1】:

    问题出在allow_headers 配置选项中。浏览器在请求 CORS 时只能发送 Access-* 标头,所有其他标头都必须列入白名单。

    无论如何,我不明白为什么通过 cURL 请求有效。我认为当我在 Chrome 中使用 Copy as cURL 工具时,我可以重现相同的请求。

    【讨论】:

    • 我认为跨域策略限制只发生在浏览器中。 Curl 只是忽略它,因为它用于连接到其他域中的远程 api。
    • @Carlos 但我复制了 OPTIONS 请求,所以我猜 cURL 应该得到与浏览器相同的响应
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多