拒绝获取不安全的头部信息"Location"。

10
我有一个网站和REST api服务器。
我使用ajax post请求到REST服务器来创建新模型。这个请求的答案将是"HTTP/1.1 201 Created"响应,带有头部"Location: http://myapi.com/some/path/111"。但是我得到了错误信息Refused to get unsafe header "Location"。我知道这是由于跨域访问策略和其他等原因。
有人知道如何修复它吗?也许我需要在响应中添加"Access-Controll-Allow-SOMETHINGHERE"头?
更新:
网站URL http://www.mydomain.com/ 原始URI为http://api.mydomain.com/model/,新位置URI为http://api.mydomain.com/model/211 原始URI用于ajax POST请求,响应带有新的Location头部。

原始的URL是什么,新的Location URL是什么? - Pekka
4个回答

8

这是因为默认情况下(不安全的),Location头信息不会向调用客户端(在这种情况下是您的ajax代码)公开。要公开它,您需要返回额外的头信息:

Access-Control-Expose-Headers: Location

这样浏览器就会公开它,这样客户端就可以阅读它。您可以添加多个逗号分隔的标头。更多信息请参见此处。在此处,您可以了解安全(简单)的方法、标头和内容类型,不需要任何其他配置。

你能显示完整的代码吗? - Evan Erickson
@EvanErickson 这取决于你使用的后端语言。在 Java 中,当使用 Servlet Filter 时,可以使用 HttpServletResponse.setHeader("Access-Control-Expose-Headers", "Location"); 。在 PHP 中,您可以使用 header('Access-Control-Expose-Headers: Location'); ,但我不建议使用这种手动方法。您应该使用完整的组件,在您的应用程序中添加对 CORS 的支持,并允许配置允许的方法/标题(对于 Java:https://github.com/search?l=Java&q=cors+filter&type=Repositories) - MeTTeO
是的,不幸的是没有人告诉BlueSnap。该公司有一个信用卡API,需要您从位置标头获取响应...为什么他们没有将有效负载放在响应正文中,我永远不会知道。他们希望您解析标头。糟糕的公司。 - Evan Erickson

2

如果您需要通过Dropzone等工具将文件上传到Amazon S3,您需要在CORS配置中添加以下内容。

<ExposeHeader>location</ExposeHeader>

1

我会尝试解决这个问题,可以通过从调用中返回新位置的值或让客户端代码知道新创建的项目存储在哪里来解决。

另一个选择是为原始域上的调用创建代理。


0
header Location: http://myapi.com/some/path/111"

那段代码完全错误。使用它正确,或者几乎正确。

试试这个:

header("Location: http://myapi.com/some/path/111");

或者

header("Location: http://myapi.com/some/path/111"); exit();

如果这不起作用,请让我知道 :-)


1
谢谢Stian,但我知道如何使用PHP添加Location头。问题在于跨域策略或类似的东西。 我在浏览器控制台中收到错误“拒绝获取不安全的头“位置””,而不是按照新的URI进行。 - Eugene Manuilov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接