【问题标题】:Cross Domain Resource Sharing GET: 'refused to get unsafe header "etag"' from Response跨域资源共享 GET:'拒绝从响应中获取不安全的标头“etag”'
【发布时间】:2011-08-14 22:40:31
【问题描述】:

没有自定义标头的简单 GET 请求。响应按预期返回。可以访问正文中的数据,但不能访问标题。

当我尝试访问“etag”标头时,浏览器会引发异常:

拒绝获取不安全的标头“etag”

Chrome、Safari 和 Firefox 的行为都相同。我没有在IE上测试过。

我在这里错过了什么?

【问题讨论】:

  • 更新:只能访问以下标头:-过期-上次修改-内容语言-缓存控制-内容类型
  • 如果有人想知道这是什么时候修复的,我在webkitchromium 中找到了错误。

标签: javascript ajax web-applications rest cors


【解决方案1】:

使用 CORS 时仅公开简单的响应标头。简单的响应标头定义为hereETag 不是一个简单的响应头。如果要暴露非简单的标头,则需要设置Access-Control-Expose-Headers 标头,如下所示:

Access-Control-Expose-Headers: ETag

但是,请注意,我注意到 Chrome、Safari 和 Firefox 中的错误会阻止非简单标头正确公开。这可能现在已经解决了,我不确定。

您不需要进行预检请求,因为只有非 GET/POST http 方法或非简单的 request 标头才需要预检(并且您正在询问 response 标题)。

【讨论】:

  • 我确认对 Access-Control-Expose-Headers 标头的支持存在问题。
  • 我很想知道是什么让 Last-Modified 变得简单而不是 ETag。他们不应该支持缓存优化的相同目的吗?
  • 你说得很好。我不知道它背后的动机,但这里有一个线程提到它(我还没有读过它):lists.w3.org/Archives/Public/public-webapps/2010AprJun/…
  • 我在设计可恢复上传协议时遇到了这个问题。 'Content-Length' 被视为响应 http“HEAD”请求的“不安全”标头;多么沉重。只有 Safari nightlies 似乎尊重 'Access-Control-Expose-Headers' 标题。耶万维网。
  • 谢谢。它为我工作。但是当我调用 wso2 api manager url 时,同样的错误会重复。你能帮我吗
【解决方案2】:

您是否尝试过 AJAX 2.0(跨域共享)是 W3C 最近推出的一种方法:http://www.w3.org/TR/XMLHttpRequest2/#ref-cors

还有另一种方式,叫做 JSON-P,它就像一个 JSON 请求,但是你可以跨域使用它:http://en.wikipedia.org/wiki/JSONP

如果设置不正确,两者都可能对网站所有者非常危险。所以使用的时候一定要小心。

[PS] 不确定这是否有帮助:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

【讨论】:

  • 您阅读问题的标题了吗?它应该是 CORS
  • 糟糕,老实说,我并没有真正注意到这一点。但仍然可以使用 JSONP
  • 当然,但是知道发生了什么很有趣。特别是因为 JSONP 在错误处理方面很糟糕
  • 是的,我不能不同意你的看法。但是,我并不是最擅长使用 CORS,因为我没有过多地使用它。我想我会以他们的方式漂浮一些阅读材料和一些想法。
猜你喜欢
  • 1970-01-01
  • 2012-10-25
  • 2021-07-18
  • 2013-08-02
  • 2013-12-08
  • 2017-04-04
  • 2011-05-07
  • 2017-01-22
  • 2013-05-06
相关资源
最近更新 更多