尝试访问http://www.kawa.net/works/ajax/romanize/romanize.cgi?q=%ED%96%88%EB%8B%A4?&mode=hangulis我只收到错误“不允许访问控制允许来源。” 我尝试用谷歌搜索这个问题并找到 2 条建议,1 条说我应该使用 --allow-file-access-from-files 启动 Chrome,还有一条说我应该在 WAAMP 服务器上运行页面/脚本。这些都不起作用。据我所知,这是出于安全原因。我正在考虑简单地将 $http 请求转到我的服务器,而不是在那里我将有一个 PHP 文件来联系外部 URL。我想我的问题是:有必要这样做还是有什么办法可以从客户端脚本中做到这一点?
1 回答
为了保护它们免受跨站点脚本攻击,浏览器具有内置的安全功能,可防止 javascript 向与最初请求的 HTML 页面不在同一域内的 URL 发出 HTTP(又名 AJAX)请求。
[特别是当从本地文件系统(即 file:///...)接收到原始 HTML 文件时,Chrome 会限制任何 HTTP 请求。正如您所说,您可以使用 --allow-file-access-from-files 选项将其关闭,或者通过始终从 Web 服务器加载页面而不是直接从文件系统加载来修复它。]
事实证明这是相当严格的,因为在许多有效情况下,您的 javascript 应用程序希望访问由位于不同域的第 3 方提供的 Web 服务。在您的情况下,您想要访问将韩文字符罗马化的服务。
所以有很多方法可以绕过这个限制:
服务器上的代理
第一种是在您自己的服务器上提供代理服务,将请求传递给第三方服务,然后将其返回给浏览器。浏览器正在向它获取原始 HTML 的同一服务器(即域)发出请求,因此很高兴。
JSONP
第二种是使用 hack,例如 JSONP ( http://en.wikipedia.org/wiki/JSONP ),它涉及向 HTML 动态添加一个新的脚本标签,该标签将加载一个新的 JavaScript 文件并执行它。您必须配置服务器以包装您在调用浏览器中的应用程序提供的函数时请求的数据,以解包数据并使用它。这由使用 .jsonp 方法的 AngularJS $http 服务支持:http://docs.angularjs.org/api/ng . $http#jsonp。查看页面底部的示例以获取更多信息。
CORS
最后也是最复杂的方法是利用称为跨域资源共享 (CORS) 的标准: http ://en.wikipedia.org/wiki/Cross-origin_resource_sharing 。这是现在大多数浏览器中提供的标准,其中浏览器能够与托管不同域上的资源的服务器协商,以同意可以返回某些数据。它不需要在客户端应用程序中进行任何更改,因此 $http 完全支持它,但它需要您设置服务器才能正确响应。我想您所指的服务不支持这一点。顺便说一句,当 CORS 运行时,您会看到许多额外的 OPTION 请求被发送到服务器。这是协商机制的一部分,完全正常。