【问题标题】:Access-Control-Allow-Origin is not recognized by ChromeChrome 无法识别 Access-Control-Allow-Origin
【发布时间】:2014-11-28 21:33:27
【问题描述】:

我了解 CORS 以及如何在服务器响应上设置适当的 Access-Control-* 标头。我发现的问题是,即使我的服务器以 Access-Control-Allow-Origin:* 响应,Chrome 也拒绝接受响应。

OPTIONS 请求:

OPTIONS /api/shows/1 HTTP/1.1
Host: *****
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Access-Control-Request-Headers: accept, platform, version
Accept: */*
Referer: http://local host:8888/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

回复:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Content-Type: */*
Content-Encoding: gzip
Expires: -1
Server: Microsoft-IIS/8.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type, Platform, Version
Access-Control-Allow-Methods: OPTIONS, TRACE, GET, HEAD, POST, PUT, DELETE
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 03 Oct 2014 19:07:28 GMT

在调试控制台中,Chrome 显示:

XMLHttpRequest 无法加载 http://****/api/shows/1。 请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'localhost:8888'。

显然,响应中有 一个 Access-Control-Allow-Origin,但由于某种原因 Chrome 认为它无效?是否存在我无法在此响应中使用通配符的情况?

提前致谢!

【问题讨论】:

  • 您的浏览器是否也在预检请求后发送实际请求?还是您的最终目标是真正读取 OPTIONS 响应(即,您的 Ajax 代码执行 xhr.open("OPTIONS", "/api/shows/1"))并且您认为这实际请求? (即便如此,这仍然是一个预检,因为 OPTIONS 是一种非简单的 HTTP 方法,但这会让您更加困惑。)
  • 是的,浏览器跟随一个 GET 请求,但它被放弃了。谢谢你的想法。
  • 只是为了 100% 清楚,“放弃”是指永远不会发送 GET 请求? (在 Chrome 网络检查器中它变成红色?)
  • 是的,这就是我的意思。 GET 请求显示为红色,没有响应并显示“显示临时标头”消息
  • 我能快速发现的唯一可能的问题是您的浏览器在Access-Control-Request-Headers 中将accept 作为请求标头发送,但在Access-Control-Allow-Headers 中是不允许的。我不确定为什么它甚至在那里,因为Accept 是一个简单的请求标头,但这可能是导致拒绝的原因?

标签: javascript ajax cors access-control


【解决方案1】:

转到“桌面”选择“Google chrome”图标并“右键单击”它,然后转到其“属性”

在 Properties 中找到该框中带有“Target”标签的输入框,chrome 的位置如下所示。

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="c:/someFolderName"

最后,重新启动 Chrome 以在屏幕顶部看到一个黄色的弹出窗口

来源:https://www.thegeekstuff.com/2016/09/disable-same-origin-policy/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%253A+TheGeekStuff+(The+Geek+Stuff)

祝你好运

【讨论】:

  • 感谢您的尝试,但这不是解决问题的方法,而是一种完全禁用非常重要的浏览器安全功能的方法。我不建议任何人使用此选项,因为它会打开您的浏览器以跨所有站点进行跨站点脚本攻击。此外,如果应用这种“仅用于开发”,您会错误地认为您已经修复了软件中的问题,但生产中的用户仍然会遇到问题
【解决方案2】:

在这种情况下,我还通过在 GET 响应中包含 Access-Control-* 标头来解决该问题。根据我对规范的理解,这不应该是必需的,但问题已通过这种方式解决。

如果有人对此有解释,我很想听听

【讨论】:

【解决方案3】:

Access-Control-Request-Headers 区分大小写... 接受应该是接受

【讨论】:

  • 你能提供一个引用吗?我在 W3c 规范中没有看到标题区分大小写:w3.org/TR/cors 此外,Chrome 会在飞行前自动将标题名称更改为小写,所以如果是这种情况,我会感到非常惊讶
  • 来自html5rocks.com/en/tutorials/cors HTTP 标头匹配(不区分大小写):接受 Accept-Language Content-Language Last-Event-ID Content-Type,但仅当值为以下之一时:application/x- www-form-urlencoded multipart/form-data text/plain
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 2012-03-22
  • 2016-01-08
  • 2011-10-26
  • 2019-10-25
  • 2019-03-12
  • 2017-06-15
相关资源
最近更新 更多