如何将 jQuery AJAX 用于外部域?

Posted

技术标签:

【中文标题】如何将 jQuery AJAX 用于外部域?【英文标题】:How to use jQuery AJAX for an outside domain? 【发布时间】:2010-12-02 03:23:30 【问题描述】:

我正在尝试使用 .get() 或 .post() 执行简单的 jQuery AJAX 尝试。

如果我的服务器上有本地副本并执行以下操作:

$.get('/hash.php',...,...)

我在我的控制台中用 firebug 监控 get 已完成并得到响应。

我改变的只是外部服务器的 URI,没有任何反应。

$.get('https://secure.mysite.com/subdir/hash.php',...,...)

如果我去掉 's' 或者我使用 post 来代替,都没有帮助。我是否遗漏了一些我应该在 jQuery 中使用的参数?

编辑:我忘了提到我这样做的原因是因为我最终要从 PHP4 站点迁移到 PHP5 站点,但是现在 PHP4 站点需要一个 PHP4 中没有的函数。所以我正在调用 PHP5 服务器来完成它。我想我有一个很好的解决方法。谢谢!

【问题讨论】:

【参考方案1】:

您不能将 Ajax 请求发送到部署应用程序的另一个域之外的另一个域。这是因为在网络浏览器中实现了Same Origin Policy——一种安全措施。

不过,有两种可能的解决方案:

将请求发送到您自己的服务器,该服务器将充当另一个服务器的代理(通过 PHP 脚本,或者更好的是,使用 Apache 的一些 mod_proxy_http 模块) 或不使用“Ajax”,而是使用其他技术,例如动态创建 <script> 标记——它们不受 SOP 约束。

【讨论】:

你可以使用jsonp,它只是你提到的<script>标签解决方案的一个美化版本。【参考方案2】:

确实,由于浏览器的原因,您通常无法在域外执行 Ajax。但是使用 JSONP 可以做到这一点。 jQuery 现在也有一个用于 Ajax 的 jsonp 参数。要完成这项工作,您需要控制服务器的输出。

【讨论】:

【参考方案3】:

javascript 无法访问 javascript 文件来源之外的服务器。

这是一项安全功能。

根据您想要获得的特定于浏览器的方式,您可能会绕过这个问题,但这会变得有点滑坡。

【讨论】:

【参考方案4】:

您不能直接进行跨域 ajax 请求,这将是一个安全问题。

您需要从 jquery 调用本地 php 文件,并让 php 文件与其他域通信。

【讨论】:

【参考方案5】:

有一种称为 JSONP 的方法可以用来规避这种情况。见SO #570100第二个回复

【讨论】:

以上是关于如何将 jQuery AJAX 用于外部域?的主要内容,如果未能解决你的问题,请参考以下文章

IE8 环境的 JQuery 中的 $.ajax 拒绝访问---解决方案

Jquery的load加载本地文件出现跨域错误的解决方案

如何使 JQuery-AJAX 请求同步

将 PHP 数组传递给外部 jQuery $.ajax

jQuery 只允许一个版本

jQuery ajax url 参数 drupal 服务器