【问题标题】:Safari - XMLHttpRequest cannot load X due to access control checks. [Inspector]Safari - 由于访问控制检查,XMLHttpRequest 无法加载 X。 [检查员]
【发布时间】:2020-10-28 13:15:24
【问题描述】:

情况:

每当您在 Safari https://nvm.samengroen.com/plan/basic/497 中访问此 URL 并在控制台中查看有关 XMLHttpRequestaccess control checks 的错误。

奇怪的是,当我打开开发者工具并重新加载页面时,它工作正常。

有人可以澄清为什么它在打开开发者工具的情况下工作。以及可能导致此问题的原因。

信息:

这个项目由一个Angular 前端(nvm.samengroen.com) 和一个API-Platform Symfony 后端(broker-api.samengroen.com) 组成>。它们都在同一个通配符 SSL 证书上,我发现这可能是答案,但登录并查看从 API 获取数据的其他页面没有任何问题。

我们也在.env文件中试过这个,没有任何结果:

###> nelmio/cors-bundle ###
CORS_ALLOW_ORIGIN=^https?://.*?$
###< nelmio/cors-bundle ###

到目前为止我的发现:

我一直在谷歌上搜索解决方案,但找不到明确的答案。

https://laracasts.com/discuss/channels/laravel/cors-access-control-allow-origin-issues-on-safari-mobile-and-desktop

谷歌告诉我这可能是因为

  • 支持 HTTP/2 的浏览器
  • 多域证书(可能是通配符证书)
  • 在某些时候,apache 想要重新协商 http/2 的客户端实现中不支持的 TLS

Safari 10.1: XMLHttpRequest with query parameters cannot load due to access control checks

您的服务器需要回复 OPTIONS http 方法。不仅是 GET/POST/PUT/DELETE。 Safari 默默地请求这个隐藏在后台。您可以通过对连接的 MITM 攻击来发现这一点


编辑#1

所以在翻遍服务器日志后,我发现了以下内容:

AH02032: Hostname nvm.samengroen.com provided via SNI and hostname broker-api.samengroen.com provided via HTTP have no compatible SSL setup, referer: https://nvm.samengroen.com/plan/basic/497

似乎它确实与 SSL 证书和可能的通配符有关。

【问题讨论】:

  • 无法在 Firefox/chrome 中以注销状态重现您的错误消息。 (ff 带有被阻止的谷歌标签管理器)
  • 不对,错误只出现在safari
  • 因为您的 cors_allow_origin 正则表达式根本没有限制,请改用*developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 表示,如果您指定 * 以外的任何内容,则可能需要添加更多标题。您还检查过手动定制的OPTIONS 请求以查看返回的标头吗?
  • 是的,我们之前有*,但那没有用。我觉得问起来很愚蠢,但是你怎么能手动发出OPTIONS 请求呢?
  • 你可以使用curl,虽然链接的脚本应该修改很多,更多的资源:@​​987654326@ 通常预检请求失败(甚至可能不会出现在网络中控制台)

标签: symfony ssl safari xmlhttprequest api-platform.com


【解决方案1】:

请将此配置添加到您的nelmio_cors.yaml 配置中。

nelmio_cors:
defaults:
    origin_regex: true
    allow_origin: ['*']
    allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
    allow_headers: ['Content-Type']
    expose_headers: ['Link']
    max_age: 3600
paths:
    '^/api/':
        allow_origin: ['*']
        allow_headers: ['*']
        allow_methods: ['OPTIONS','POST', 'PUT', 'GET', 'DELETE', 'PATCH']
        max_age: 3600

这里我们也允许OPTIONS 请求。

注意:我假设所有路由的所有 api 的前缀都为 /api/

【讨论】:

  • 我们配置的唯一区别是路径 allow_headers 设置为 ['Authorization', 'X-Requested-With', 'Content-Type', 'Accept', 'Origin', 'X-Custom-Auth'] 而不是 *。我可以试一试。
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 2018-05-29
  • 2017-09-16
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 2020-10-18
  • 2020-11-18
相关资源
最近更新 更多