使用 JQuery/PHP 进行跨域 Ajax 请求

IT技术 php javascript jquery ajax
2021-02-20 07:41:04

帮助,如果可以的话——

情况:

http://foobar.com包含一个远程托管的 javacript 文件 ( http://boobar.com/stuff.js )。

目标是从 foobar.com 上远程托管的 php 脚本中获取警报

我在 stuff.js 中尝试了以下代码:

$.ajax({
  type: "GET",
  url: "http://www.boobar.com/script.php?callback=?",
  dataType: 'jsonp',
  success: function(result) { alert(result); }
});

没有运气。

$.getJSON("http://www.boobar.com/script.php?jsonp=?",
  function(data) { alert(data); }
);

也没有运气。

在 php 方面,我尝试了以下两种方法:

return json_encode(array(0 => 'test'));

echo json_encode(array(0 => 'test'));

在 Firefox 中,我收到一个安全错误。我知道它认为我违反了安全模型。但是,根据 jquery 文档,我应该能够做到这一点。

6个回答

该错误似乎是同源策略的一项安全功能:为简化起见,您只能对原始服务器 ( http://foobar.com)上的内容发出 AJAX 请求解决此问题的一种方法是在原始服务器上创建一个简单的外观,例如:

 <?php
 // this file resides at http://foobar.com/getstuff.php
 echo file_get_contents('http://www.boobar.com/script.php?callback=?'
          . $possibly_some_other_GET_parameters );
 ?>

然后,从foob​​ar.com,可以使一个AJAX请求http://foobar.com/getstuff.php(这反过来又使一个HTTP GET请求从您的Web服务器boobar.com并将其发送回浏览器)。

对于浏览器,请求会到达源服务器,并被允许(浏览器无法知道响应来自幕后的其他地方)。

注意事项:

  • foob​​ar.com 上的 PHP 配置必须allow_url_fopen设置为“1”。尽管这是默认设置,但某些服务器已禁用它。
  • 对 www.boobar.com 的请求是从 foobar.com服务器发出的,而不是来自浏览器。这意味着不会将任何 cookie 或用户身份验证数据发送到 www.boobar.com,只会发送您放入请求 URL (" $possibly_some_other_GET_parameters") 的任何内容。
我也会使用 cURL,但我使用file_get_contents了一个简单的例子。
2021-04-22 07:41:04
对于最后一步,cookies 和身份验证,我猜也许可以用 cURL 来完成
2021-05-05 07:41:04

您可以使用脚本标签和 json 从另一台服务器异步获取数据:

<script type="text/javascript" src="http://somesite.com/path/to/page/"></script>

您可以使用它来动态加载远程 javascript(通过创建一个新的脚本元素并设置 src 属性,然后加载到 DOM 中),它可以设置一个变量。但是,您需要真正信任远程站点,因为 JS 将在没有任何先决条件的情况下进行评估

有一个方法叫做window.name transportorwindow.name method它使用了一个通用的浏览器错误(不确定这实际上是否是一个错误)。您通过 iFrame 发出请求,加载的页面将您需要的信息放入 JavaScript 窗口对象本身的“名称”属性。

此方法使用“blank.htm”,因为它首先导航到目标页面,然后返回到 blank.htm 页面以克服“同源策略”限制。

Dojo 已经实现了这一点,您可以在此处找到更详细的说明

此外,我在我编写的库中基于此方法实现了一个跨域 XMLHttpRequest 对象,该库可在此处找到

您可能无法使用该库,因为它需要 1 或 2 个额外的库,可在此处找到

如果您需要进一步的帮助以您的风格实现它,我会尽力而为。

所以我最终做了什么,因为它只是一个 GET - 不需要检索数据 - 我使用 JQuery 创建一个隐藏的 iframe,其中包含我想要传递的变量的 URL 设置为源。像魅力一样工作。感谢所有提供反馈的人 - 谢谢!

如何?请提供详细信息。谢谢。
2021-04-22 07:41:04
事实上,我明白了。感谢 iframe 的想法。
2021-04-29 07:41:04

这个怎么样 !!使用 php 代理。

使用 PHP 的跨域 AJAX 调用 http://www.phpfour.com/blog/2008/03/cross-domain-ajax-using-php/