【问题标题】:CORS 'null' is not the same origin as 'null'CORS 'null' 与 'null' 的来源不同
【发布时间】:2018-03-29 10:17:56
【问题描述】:

我对 CORS 有一个奇怪的问题。我正在从文件中发出请求,我的问题从今天开始,在它工作之前(它仍在 firefox 上工作)。但是在 chrome 上我遇到了一个问题,它说服务器端不允许使用“null”来源。但如果我检查网络,我可以看到:

Response
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept, content-type
Access-Control-Allow-Methods: PUT, DELETE, POST, GET, OPTION
Access-Control-Allow-Origin: null
Connection: close
Content-Length: 21
Content-Type: application/json
Date: Thu, 29 Mar 2018 10:10:53 GMT

Request
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Authorization: Basic somePasswordHere
Connection: keep-alive
Host: localhost:8080
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36

我现在在发布之前修改的“somePasswordHere”实际上是基本身份验证中的用户名和密码。

奇怪的是,我在 chrome 上的控制台中得到了这个:The 'Access-Control-Allow-Origin' header has a value 'null' that is not equal to the supplied origin. Origin 'null' is therefore not allowed access.

如果我检查我的服务器,我可以看到我收到来自空源的请求并且我允许它,我可以看到有凭据和东西,并且实际的 cal 处理正确,但是在 chrome 端我得到了这个反正消息。

奇怪的是,它可以在 Firefox 上运行(通常情况相反)。

有什么想法吗?我是否必须为 chrome 或其他东西添加另一个标题?

PS:我可以看到 chrome 昨天更新了,所以它可能已经损坏了一些东西。

PS2:在网络选项卡的“响应预览”中的另一个奇怪的事情是,我实际上可以看到内容是正确的并且它在那里......但是消息'提供的来源不同于......'仍然存在 dahell?

【问题讨论】:

    标签: html server cors client


    【解决方案1】:

    null 被解释为文字主机源(地址),不应放入Origin 标头中。此标头应包含启动请求的主机名。

    出于同样的原因,如果要允许所有来源,请尝试将 * 而不是 null 放入响应的 Access-Control-Allow-Origin 标头中。

    您可能知道,每个 CORS 请求实际上由两个请求组成:preflight 请求(始终发送)和实际请求(仅在 preflight 请求成功时发送)。也许Chrome 将 null 检测为特殊关键字而不是主机名,并阻止该请求。 Firefox 可能会更宽容一些,并且可以理解预期的行为。

    【讨论】:

    • 我不能输入“*”,因为我想要凭据。我把'null'放在一个字符串中,然后再把它放在标题中。
    • 是的,我明白这一点,我推测null 在较新版本的 Chrome 中可能不再是有效的主机名。如果您将另一个字符串(或真实主机名)放入标头中会发生什么?
    • 该应用程序是使用 Angular 制作的,并且在使用 Angular 进行查询时它可以工作(Angular 将应用程序托管在 localhost:4200 上)。我的服务器也正确地允许它通过。一旦它被编译为从一个文件运行它就不起作用了。如果我在 iis 服务器上托管文件,它也可以工作。恐怕 chrome 确实在他们的新更新中添加了这个,并且不再允许 null origin 并且 firefox 可能会跟随......
    • “每个 CORS 请求”都包含一个预检请求是不正确的。许多类型的 CORS 请求不需要预检,因此它们被发送到服务器,然后您的浏览器决定是否显示对请求脚本的响应。
    【解决方案2】:

    我找到了答案,

    在阅读了一些关于 cors 的信息后,我发现“null”起源在 firefox 上不起作用。浏览器在将其发送到服务器之前隐藏了来源,因此它实际上不是“null”而是“file://”。

    因此,允许文件为“null”来源的正确方法是:'Access-Control-Allow-Origin' : 'file://'

    这奏效了。

    我不知道为什么 chrome 决定现在才这样做,他们让我的应用程序运行了几个月。无论如何,有了这个改变,我恢复了正常。

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 2019-08-11
      • 2019-02-15
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2019-08-10
      相关资源
      最近更新 更多