拒绝获取不安全的标题“位置”

Posted

技术标签:

【中文标题】拒绝获取不安全的标题“位置”【英文标题】:Refused to get unsafe header "Location" 【发布时间】:2011-12-03 17:59:38 【问题描述】:

我有一个网站和我的 REST api 服务器。

我向 REST 服务器发出 ajax 发布请求以创建新模型。此请求的答案将是“HTTP/1.1 201 Created”响应,标题为“位置:http://myapi.com/some/path/111” 但我收到错误消息Refused to get unsafe header "Location"。我知道这是因为跨域访问策略和其他 bla bla bla。

有人知道怎么解决吗?也许我必须在响应中添加“Access-Controll-Allow-SOMETHINGHERE”标头?

UPD:

网址http://www.mydomain.com/

原始 URI 是 http://api.mydomain.com/model/,新位置 URI 是 http://api.mydomain.com/model/211

原始 URI 用于 ajax POST 请求,该请求使用新的 Location 标头进行响应。

【问题讨论】:

原始 URL 是什么,新的 Location URL 是什么? 【参考方案1】:

这是因为 Location 标头默认不暴露给调用客户端(在这种情况下是您的 ajax 代码)(它是“不安全的”)。要公开它,您必须返回额外的标题:

Access-Control-Expose-Headers: Location

这样浏览器会暴露它,所以客户端可以读取它。您可以在那里添加多个逗号分隔的标题。更多关于它here。 Here 您可以阅读哪些方法、标头和内容类型是安全的(简单)并且不需要任何额外的配置。

【讨论】:

你能在完整的代码中显示这个吗? @EvanErickson 这取决于您使用的后端语言。对于使用 Servlet 过滤器的 java,您可以使用 HttpServletResponse.setHeader("Access-Control-Expose-Headers", "Location");php 中我相信您可以使用 header('Access-Control-Expose-Headers: Location'); 但是我不推荐这种手动方法。您应该使用一个完整的组件,它在您的应用程序中添加对 CORS 的支持并允许配置允许的方法/标头(对于 Java:github.com/…) 是的,很遗憾没有人告诉 BlueSnap。那家公司有一个信用卡 api,它要求您从位置标头中获取响应......为什么他们没有将有效负载放在响应的正文中,我永远不会知道。他们希望您解析标头。糟糕的公司。【参考方案2】:

对于 Amazon S3 上传(例如通过 Dropzone),您需要在 CORS 配置中使用它。

<ExposeHeader>location</ExposeHeader>

【讨论】:

【参考方案3】:

我只是解决它,要么通过调用将新位置作为值返回,要么让客户端代码知道新创建的项目的存储位置。

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

【讨论】:

【参考方案4】:
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();

如果这不起作用,请告诉我:-)

【讨论】:

感谢 Stian,但我知道如何使用 PHP 添加 Location 标头。问题出在跨域策略或类似的东西上。我在浏览器控制台中收到错误 Refused to get unsafe header “Location”,而不是通过新的 URI。

以上是关于拒绝获取不安全的标题“位置”的主要内容,如果未能解决你的问题,请参考以下文章

拒绝获取不安全的标头“Content-Length”

html5用户如果拒绝获取经纬度之后页面加载一直提示拒绝获取经纬度,怎麽获取权限,页面每次加载都能

拒绝获取不安全的标头“AMP-Access-Control-Allow-Source-Origin”

拒绝获取不安全的标头“x-parse-job-status-id” - Vue.js 和 Parse Server

拒绝从外部mp3获取不安全的标题“Content-Length”/读取ID3标签

尝试获取位置时“权限被拒绝”