跨域 JSON - 啥服务器提供源重要吗? [复制]
Posted
技术标签:
【中文标题】跨域 JSON - 啥服务器提供源重要吗? [复制]【英文标题】:Cross Domain JSON - does it matter what server provides source? [duplicate]跨域 JSON - 什么服务器提供源重要吗? [复制] 【发布时间】:2017-12-14 18:43:10 【问题描述】:我找到了如何进行跨域json调用here的简单教程
它工作得非常好,所以我决定使用这个例子,只需将 url 更改为:
var url = "http://api.myjson.com/bins/23xvb";
到
var url = "http://dl.sniper.pl/test.json"
不幸的是,更改它会返回这样的错误(在 chrome 中):
XMLHttpRequest 无法加载 http://dl.sniper.pl/test.json。回应 预检请求未通过访问控制检查:否 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此不允许访问 Origin 'null'。
谷歌搜索该错误并没有提供任何答案来找到解决方案,所以这是问题: 为什么会出现这样的错误以及如何解决?
【问题讨论】:
【参考方案1】:http://dl.sniper.pl/ 服务器必须配置为发送 Access-Control-Allow-Origin
响应标头以响应对 http://dl.sniper.pl/test.json 的请求。
但由于该服务器未发送 Access-Control-Allow-Origin
响应标头,因此您的浏览器拒绝让您的前端 javascript 代码访问该响应。
因此,您要么必须配置 http://dl.sniper.pl/ 服务器以发送 Access-Control-Allow-Origin
,要么您可以通过 CORS 代理发出请求。
有一个开放的 CORS 代理,您可以通过将代码更改为以下方式来请求:
var url = "https://cors-anywhere.herokuapp.com/http://dl.sniper.pl/test.json"
通过开放的 CORS 代理 https://cors-anywhere.herokuapp.com 发送请求,该代理将 Access-Control-Allow-Origin
响应标头添加到它,然后将其作为响应传递回您的请求前端代码。
带有Access-Control-Allow-Origin
响应标头的响应是浏览器看到的,因此浏览器允许您的前端 JavaScript 代码实际访问响应。
您还可以使用 https://github.com/Rob--W/cors-anywhere/ 轻松设置自己的 CORS 代理
请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS,了解当您使用 XHR 或来自 JavaScript 库的 Fetch API 或 AJAX 方法发送跨域请求前端 JavaScript 代码时浏览器的行为方式 - 以及有关必须接收哪些响应标头才能执行的详细信息浏览器允许前端代码访问响应。
【讨论】:
感谢您的简单而良好的解释。我在我的代码中使用了您的代理 url,它可以工作,但是我不想依赖第三方服务器并且仍然无法通过 .htaccess 实现。我在服务器上创建了一个目录,并将 json 文件和 .htaccess 都放在那里:benjaminhorn.io/code/… 它仍然不起作用。我应该在大多数父目录的 .htaccess 中更改它吗? 如果您使用 Apache 设置 Access-Control-* 标头,您可能希望通过运行“a2enmod headers”来开始故障排除,以确保您启用了标头模块。但无论如何,在这一点上,如果这不起作用,您可能想要创建一个单独的新问题并用“apache”标记它 - 因为您现在似乎需要帮助的是一个与一般问题不同的更具体的问题在这里的问题中描述。 (您可以在这里从 Apache 专家那里获得更具体的帮助,方法是将其作为一个单独的问题提出并标记它。) 这可能是 apache 的问题,但是我只是服务器的最终用户,我没有任何权限来更改 apache 设置。我可能可以测试这些设置,但我不确定我该怎么做。你能帮忙吗? 如果您发布一个单独的新特定问题,我很乐意为您提供帮助,*** 的许多其他人也可以为您提供帮助。通过这样做,您将获得更多的帮助和更好的帮助 【参考方案2】:您应该在您的 htaccess 中配置您的服务器来执行此操作 你需要这样的东西
<RequireAll>
Require all granted
</RequireAll>
【讨论】:
不幸的是这并没有改变任何东西 如果您使用 chrome,您必须花时间查看更改,您需要清除有关此域的所有 cookie,只需在此处查阅 apache 文档; httpd.apache.org/docs/2.4/howto/access.html 我已经清除了所有的cookies,结果还是一样:/ 所以尝试使用 firefox chrome 非常持久地保留元数据 问题是关于 CORS,而不是 HTTP Auth。这与它无关。以上是关于跨域 JSON - 啥服务器提供源重要吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Ajax跨域Json跨域Socket跨域和Canvas跨域等同源策略限制的解决方法