拒绝获取不安全的标题“位置”
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。以上是关于拒绝获取不安全的标题“位置”的主要内容,如果未能解决你的问题,请参考以下文章
html5用户如果拒绝获取经纬度之后页面加载一直提示拒绝获取经纬度,怎麽获取权限,页面每次加载都能
拒绝获取不安全的标头“AMP-Access-Control-Allow-Source-Origin”
拒绝获取不安全的标头“x-parse-job-status-id” - Vue.js 和 Parse Server