通过修改 HTTP 标头使用没有 CORS 的 XMLHttpRequest?

bap*_*ptx 5 javascript ajax cross-domain http-headers cors

我正在使用(已弃用的)Twitter API 1.0 进行一些测试

例如,我想从 API 获取数据,客户端使用来自任何跨源网页的 AJAX 浏览器请求。它可以是新的空白标签、本地 HTML 页面或任何现有网站。

我试过 JSONP,它工作得很好,但我想使用默认的 XMLHttpRequest 即使 Twitter 服务器不支持 CORS http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

例如,在 google.com 主页上,我创建了一个对 Twitter API 的简单 AJAX 调用,并使用 Firebug 执行:

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.twitter.com/1/friends/ids.json?screen_name=baptx", false);
xhr.send();
Run Code Online (Sandbox Code Playgroud)

由于同源策略,这将不起作用并在 Firebug 上打印错误:

Error: Failure
xhr.send();
Run Code Online (Sandbox Code Playgroud)

它返回一个 HTTP 200 OK 代码,但没有从服务器收到 JSON 数据。

我已经看到来自 google.com 网页的请求和来自 api.twitter 网页的请求之间的两个差异(它适用于 Twitter API 请求,因为它是 API 域名,同源)。

添加了一个带有当前域名的 Origin HTTP 标头:

Origin  https://www.google.com
Run Code Online (Sandbox Code Playgroud)

Referer HTTP 标头不是 https://api.twitter.com/像来自 api.twitter.com 页面的请求,但在我的情况下是:

Referer https://www.google.com/webhp?hl=en
Run Code Online (Sandbox Code Playgroud)

这就是为什么我尝试删除 Origin HTTP 标头并将当前 Referer HTTP 标头修改为https://api.twitter.com/

我已经使用 Firefox ModifyHeaders 扩展完成了这项工作并且它有效,我可以在 Firebug“Net”选项卡中检查这些更改是否正确进行。

现在,我有来自 google.com 网页和 api.twitter.com 网页的请求的相同请求标头。它仍然无法从 API 以外的其他域执行 AJAX 请求,即使 HTTP 标头被覆盖,为什么?

顺便说一句,您知道为什么从 Firefox “New Tab” 向 Twitter API 发出 AJAX 请求会起作用吗?

bap*_*ptx 6

如果 Web 服务器不允许跨域资源共享,我们必须手动添加 HTTP 响应头 Access-Control-Allow-Origin:*

我认为问题出在请求标头中。没有 Firefox 插件来修改 HTTP 响应头,只有 ModifyHeaders 或 TamperData 支持请求头: 在 Firefox 中修改 HTTP 响应头

我的问题实际上类似于这个问题:我可以在任何浏览器上禁用 SOP(同源策略)进行开发吗?

解决方案:有人开发了一个 Firefox 插件来强制 CORS:https://addons.mozilla.org/en-US/firefox/addon/forcecors/。或者我们可以在 GreaseMonkey 脚本中使用 GM_xmlhttpRequest,它会绕过 XMLHttpRequest 的同源策略。在 Chrome 中,没有插件可以像您想要的那样修改 HTTP 请求/响应标头,因为浏览器不提供 API,但是有一个标志可以禁用 SOP (--disable-web-security)