【问题标题】:Why if this API gives the "No Access-Control-Allow-Origin header", can I access it through the address bar or http://www.hurl.it为什么如果这个 API 给出了“No Access-Control-Allow-Origin 标头”,我可以通过地址栏或 http://www.hurl.it 访问它吗?
【发布时间】:2026-01-28 07:25:02
【问题描述】:

编辑:请参阅:https://softwareengineering.stackexchange.com/questions/216605/how-do-web-servers-enforce-the-same-origin-policy,了解为什么浏览器会强制执行 Access-Origin 限制但服务器(如 Hurl.It)不受限制。

我正在尝试使用在此处找到的 API http://forismatic.com/en/api/。但我收到“没有 'Access-Control-Allow-Origin' 标头”错误。如果是这样,为什么我可以通过直接在浏览器的地址栏中输入带有参数的 URL 或通过 http://www.hurl.it 来访问 API?如果这会影响任何事情,我正在使用 codepen。

我的代码如下。非常感谢,我已经搜索了几个小时,但我陷入了死胡同。

var quoteRequest =  new XMLHttpRequest();

quoteRequest.open("GET", "http://www.api.forismatic.com/api/1.0/?method=getQuote&format=json&lang=en", true);

quoteRequest.send();

var quote = JSON.parse(quoteRequest.responseText);

【问题讨论】:

    标签: javascript ajax api xmlhttprequest


    【解决方案1】:

    如果是这样,为什么我可以通过在浏览器的地址栏中直接输入带有参数的 URL 或通过http://www.hurl.it 来访问 API?

    因为这就是 Same Origin Policy 的工作原理:它适用于 ajax 请求,而不是直接请求(将其输入到地址栏)或服务器端请求(Hurl-It 所做的)。

    SOP 的目的是防止页面 A 从浏览器中使用页面 A 中页面 B 的资源。这主要是为了保护用户,因为当浏览器从页面 B 请求资源时,它可能会使用用户的会话或其他凭据,从而向页面 A 的代码泄露它应该有权访问的信息。 apsillers 在programmers.stackexchange.com 上有一个great explanation of this;摘录如下:

    例如,假设我不小心加载了http://evil.com/,它发送了一个http://mail.google.com/ 的请求。如果没有 SOP,并且我登录了 Gmail,evil.com 上的脚本可以看到我的收件箱。如果 evil.com 上的站点想在没有我的 cookie 的情况下加载 mail.google.com,它可以只使用代理服务器; mail.google.com 的公开内容不是秘密(但使用我的 cookie 访问时 mail.google.com 的内容是秘密)。

    如果该 API 不授予对您的来源(您的页面)的访问权限,并且不提供 JSONP 替代方案,您只能通过中间的服务器(您自己的服务器或 Hurl-It)间接使用它等)。

    【讨论】:

    • 谢谢你把事情弄清楚了。那么 Hurl It 到底在做什么呢?服务器端请求是如何工作的?
    • @irishjauntingcar:Hurl-它正在从服务器而不是浏览器发出请求。服务器端请求就是这样:从服务器发出的请求,而不是浏览器。
    • @t-j-crowder 我想我的意思是为什么来自服务器的请求比浏览器的请求更安全(因此默认允许)?特别是如果您可以使用另一台服务器作为中间人在页面 A 中使用页面 B 的资源?
    • @irishjauntingcar:这不是关于安全性,而是关于访问控制。如果提供 API 的人不想免费共享该 API 的输出,而其他人通过服务器重定向绕过它,则提供 API 的人可以很容易地阻止该服务器的请求,因为它们来自单个(或一小组)服务器。相反,如果集成是客户端的,则请求可以来自数百万台机器中的任何一台;你不能把他们都拒之门外。
    • 干杯@t-j-crowder 我现在明白了:)
    最近更新 更多