【问题标题】:Cross-origin request succeeded without CORS没有 CORS 的跨域请求成功
【发布时间】:2016-05-10 16:08:11
【问题描述】:

这让我现在怀疑自己了。

我们可以通过 jQuery Ajax 发出 POST 请求。类似的东西

$.post("https://external.com", $('form').serialize());

在我的 Chrome 控制台中,我可以看到显示

的消息

XMLHttpRequest 无法加载 {external.com}。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'mysite.com'。

然而,在网络选项卡中,这个 Ajax 调用实际上返回 200,当然,外部 Web 服务确实处理了我的请求。

任何人都可以对我有所了解,我为此发疯了......

非常感谢。

【问题讨论】:

    标签: jquery ajax http xmlhttprequest


    【解决方案1】:

    我想你可能误解了 CORS 机制的概念。如果你仔细阅读邮件,你应该明白了。

    请求的资源上不存在“Access-Control-Allow-Origin”标头。

    它说 resource 没有必需的标头,因此很明显浏览器必须先发出请求才能检查资源的标头。

    因此不允许访问来源“mysite.com”。

    这部分还说您不允许获取跨域资源,而我认为您可能希望 CORS 像阻止脚本一样安全工作(例如由攻击者注入) .

    您可以阅读有关 CORS 的更多信息here。重要的(和 tl;dr; ;-) )部分是:

    跨域资源共享标准通过添加新的 HTTP 标头来工作,这些标头允许服务器描述允许使用网络浏览器读取该信息的来源集

    【讨论】:

    • 虽然 CORS 主要保护浏览器中资源的加载,而不是阻止下载,但对于 POST 请求(和其他可以更改状态的请求),浏览器应发送预检请求以获取 CORS 标头,然后如果设置了 CORS 标头,它应该发送真正的请求。因此,虽然我知道您可能会在“网络”选项卡中看到一个请求(假设这是预检请求,如果您仔细观察,它不应该有您的 POST 正文详细信息)我不明白 OP 说这项服务处理了请求 - 因为应该没有处理请求!
    • 没错,我期待看到错误消息,没想到外部服务会处理我的请求。但是,我确实在控制台中收到了错误,并且请求确实到达了外部服务并得到了 200 响应。因此我的问题。
    • 由于您可以在 PHP(或任何其他服务器端语言)中设置 HTTP 标头,因此必须处理请求,因为您不知道最终标头是什么。如果要在 PHP 中设置 CQRS 标头怎么办?从 HTTP 通信的角度来看,资源是请求服务的结果,而不是服务本身。浏览器甚至不知道它是否是动态服务的静态资产。
    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 2016-05-05
    • 2020-12-08
    • 2015-05-25
    • 1970-01-01
    • 2022-09-24
    • 2019-01-25
    • 2015-08-12
    相关资源
    最近更新 更多