$http给出了"不允许访问-控制-允许-原始"错误在Chrome浏览器

$http gives "not allowed by Access-Control-Allow-Origin" error in Chrome

本文关键字:quot 允许 浏览器 原始 Chrome 控制 错误 不允许 http 访问      更新时间:2023-09-26

尝试访问http://www.kawa.net/works/ajax/romanize/romanize.cgi?q=%ED%96%88%EB%8B%A4?&mode=hangulis我只得到错误"不允许访问- control - allow - origin "。我试着在谷歌上搜索这个问题,发现了2个建议,一个说我应该用——allow-file-access-from-files启动Chrome,一个说我应该在WAAMP服务器上运行页面/脚本。这两种方法都不起作用。据我所知,这是出于安全考虑。我正在考虑简单地使$http请求转到我的服务器,而不是在那里我将有一个PHP文件,联系外部URL,而不是。我想我的问题是:是否有必要这样做,或者有任何方法我可以从客户端脚本做到这一点?

为了防止跨站脚本攻击,浏览器有一个内置的安全特性,可以防止javascript向与原始请求的HTML页面不在同一域的url发出HTTP(又名AJAX)请求。

[特别是Chrome限制任何HTTP请求时,原始的HTML文件是从本地文件系统(即文件:///…)收到的。正如你所说,你可以用——allow-file-access-from-files选项关闭它,或者通过总是从web服务器而不是直接从文件系统加载页面来修复它。

这被证明是相当限制的,因为有许多有效的情况下,您的javascript应用程序将希望访问位于不同域的第三方提供的web服务。在您的示例中,您希望访问一个将韩语字符罗马化的服务。

有很多方法可以绕过这个限制:

服务器上的代理

第一种方法是在自己的服务器上提供代理服务,将请求传递给第三方服务,然后将其返回给浏览器。浏览器正在向它获得原始HTML的同一服务器(即域)发出请求,因此很高兴。

<标题> JSONP h1> 二种方法是使用一种hack,比如JSONP (http://en.wikipedia.org/wiki/JSONP),它涉及到在HTML中动态地添加一个新的脚本标记,该标记将加载一个新的JavaScript文件并执行它。您必须配置服务器,以便在调用浏览器中的应用程序提供的函数时封装所请求的数据,从而打开数据并使用它。这是由AngularJS的$http服务通过.jsonp方法支持的:http://docs.angularjs.org/api/ng.$http#jsonp。要了解更多信息,请查看页面底部的示例。 <标题>歌珥h1> 后,也是最复杂的方法是利用称为跨域资源共享(CORS)的标准:http://en.wikipedia.org/wiki/Cross-origin_resource_sharing。这是现在大多数浏览器提供的标准,其中浏览器能够与托管在不同域上的资源的服务器协商,以同意可以返回某些数据。它不需要在客户端应用程序中进行任何更改,并且完全支持$http,但是它要求您设置服务器以便能够适当地响应。我猜你所指的服务不支持这个。顺便说一下,当CORS运行时,您将看到许多额外的OPTION请求被发送到服务器。这是协商机制的一部分,完全正常。