Php 从外部域检索数据

Php 从外部域检索数据,php,jquery,proxy,iframe,Php,Jquery,Proxy,Iframe,我正在创建一个分析项目。我的目标是给x-domain的所有者提供我网站上包含的少量javascript。这使我能够追踪它们的鼠标移动。我得到了跟踪,我所需要做的就是将数据发送回我的服务器,以便它可以存储在我的数据库中。我的问题是数据太大,无法通过getJSON发送 记住。。 我不能使用$.Post或任何类型的XMLhttp请求,因为我的域和x域是远程的。浏览器不允许这样做。。我只能使用getJSON 由于这不起作用,我被告知要设置一个代理。据我所知,代理仅适用于具有代理设置的服务器。不适用于尝试

我正在创建一个分析项目。我的目标是给x-domain的所有者提供我网站上包含的少量javascript。这使我能够追踪它们的鼠标移动。我得到了跟踪,我所需要做的就是将数据发送回我的服务器,以便它可以存储在我的数据库中。我的问题是数据太大,无法通过getJSON发送

记住。。 我不能使用$.Post或任何类型的XMLhttp请求,因为我的域和x域是远程的。浏览器不允许这样做。。我只能使用getJSON

由于这不起作用,我被告知要设置一个代理。据我所知,代理仅适用于具有代理设置的服务器。不适用于尝试向我发送数据的服务器

我知道这是可能的,因为我看到了。有人有什么想法吗??iframes对我正在尝试做的事情有好处吗??有人有什么资源可以共享吗


非常感谢

您考虑过使用类似的工具吗

将数据分割成块,这样getJSON就可以工作了。您可以实现数据队列,以便生产者不断用数据填充队列,而域上的消费者使用getJSON以较小的块获取数据。它不会是实时的,但你可以试试看,看看你对性能是否满意。

你可以使用javascript与flash对话,并让flash完成跨域部分


我不清楚你为什么不能使用代理。浏览器中的javascript发布到运行在x-domain上的脚本,然后该脚本使用curl或类似工具将完全相同的信息发布到您的域。

您可以让javascript创建iframe和表单,然后将表单发布到iframe中。您可以将其定位到屏幕外,以使其隐藏。例如:

function post_my_data(json){

    var f = document.createElement('form');
    f.action = 'http://www.my-domain.com/receive.php';
    f.method = 'post';
    f.target = 'posttarget';

    var i = document.createElement('input');
    i.type = 'hidden';
    i.name = 'json';
    i.value = json;

    f.appendChild(i);

    var ifr = document.createElement('iframe');
    ifr.name = 'posttarget';
    ifr.style.display = 'absolute';
    ifr.style.left = '-1000px';

    document.body.appendChild(ifr);
    document.body.appendChild(f);

    f.submit();
}

也许你比我更能理解它。我对php很在行,但对发送不同的标题和内容不是很在行。它的工作原理是向代理文件发布ajax帖子。代理文件位于外部服务器上

         $.ajax({
       type: "POST",
       url: "http://mywebsite.com/ajax-proxy.php",
       data: 'csurl=www.google.com',
       error: function(e) {console.log(e);}, 
       success: function(msg){console.log(msg)}

    });
您还需要传递csurl,这是代理将您转发到的url。在这个例子中,我使用了谷歌。但是我通常使用的csurl是我将存储ajax数据的目录

在代理文件中,有一个

$valid_requests = array()
在该数组中,您可以声明希望代理批准的所有URL。在本例中,您放置了www.google.com(注意:必须与csurl参数完全相同,否则将无法工作)

下面是代理文件

  <?php
/**
 * AJAX Cross Domain (PHP) Proxy 0.6
 *    by Iacovos Constantinou (http://www.iacons.net)
 * 
 * Released under CC-GNU GPL
 */

/**
 * Enables or disables filtering for cross domain requests.
 * Recommended value: true, for security reasons
 */
define('CSAJAX_FILTERS', true);


/**
 * A set of valid cross domain requests
 */
$valid_requests = array(
    'www.google.com'
);

/*** STOP EDITING HERE UNLESS YOU KNOW WHAT YOU ARE DOING ***/

// identify request headers
$request_headers = array();
foreach ( $_SERVER as $key=>$value ) {
    if( substr($key, 0, 5) == 'HTTP_' ) {
        $headername = str_replace('_', ' ', substr($key, 5));
        $headername = str_replace(' ', '-', ucwords(strtolower($headername)));
        $request_headers[$headername] = $value;
    }
}

// identify request method, url and params
$request_method = $_SERVER['REQUEST_METHOD'];
$request_params = ( $request_method == 'GET' ) ? $_GET : $_POST;
$request_url    = urldecode($request_params['csurl']);
$p_request_url  = parse_url($request_url);
unset($request_params['csurl']);

// ignore requests for proxy :)
if ( preg_match('!'. $_SERVER['SCRIPT_NAME'] .'!', $request_url) || empty($request_url) ) {
    exit;
}

// check against valid requests
if ( CSAJAX_FILTERS ) {
    $parsed     = $p_request_url;
    $check_url  = isset($parsed['scheme']) ? $parsed['scheme'] .'://' : '';
    $check_url .= isset($parsed['user']) ? $parsed['user'] . ($parsed['pass'] ? ':'. $parsed['pass']:'') .'@' : '';
    $check_url .= isset($parsed['host']) ? $parsed['host'] : '';
    $check_url .= isset($parsed['port']) ? ':'.$parsed['port'] : '';
    $check_url .= isset($parsed['path']) ? $parsed['path'] : '';
    if ( !in_array($check_url, $valid_requests) ) {
        exit;
    }
}

// append query string for GET requests
if ( $request_method == 'GET' && count($request_params) > 0 && ( !array_key_exists('query', $p_request_url) || empty($p_request_url['query']) ) ) {
    $request_url .= '?'. http_build_query($request_params);
}

// let the request begin
$ch = curl_init($request_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);         // (re-)send headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                 // return response
curl_setopt($ch, CURLOPT_HEADER, true);                         // enabled response headers

// add post data for POST requests
if ( $request_method == 'POST' ) {
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request_params));
}

// retrieve response (headers and content)
$response = curl_exec($ch);
curl_close($ch);

// split response to header and content
list($response_headers, $response_content) = preg_split('/(\r\n){2}/', $response, 2);

// (re-)send the headers
$response_headers = preg_split('/(\r\n){1}/', $response_headers);
foreach ( $response_headers as $key => $response_header )
    if ( !preg_match('/^(Transfer-Encoding):/', $response_header) ) 
        header($response_header);

// finally, output the content
print($response_content);
?>

这似乎是合理的。但我确实想到了这一点。但如果我那样做的话。我必须让我的服务器知道传入的每个请求都来自同一个会话。如果我不这样做,它可能会在数据库中为每个通过的数据插入一个新行。我必须通过发送一个cookie来识别它来自同一个会话。或者在客户端生成一个(半)唯一的id,并将相同的id发送给所有部件。然后服务器可以连接具有相同id的部件。我听说过iFrame,但不知道从何开始。我想这对我会有很大帮助。不确定它是否会起作用。但这显然是一个好的开始。thanx Aloti如果你知道任何其他伟大的例子,也许你可以向我推荐一本书或一个URL,请这样做,thanx如果你在谷歌上搜索“使用隐藏表单跨域发布数据”,点击率会很高,例如,但技术非常简单。缺点是您无法从帖子中获取任何数据,因此它只是单向流;原因我在分析“display”的值时出错。声明被撤回。不确定这是否会导致它不发送。但它没有发送。我也在使用jquery。所以不确定这是否会导致它。我将数据封装在下面的代码中$(#testReq')。单击(function(){})向我发送一封包含源代码的电子邮件(您可以通过我的个人资料找到我的地址),我会看一看。我也不确定。假设php文件不是为入局Ajax调用而创建的,而是为出局调用而创建的。我从我的服务器上用它在像谷歌这样的网站上试用过,效果很好。但是我试着在一个x域中使用它,但是没有。所以问题不在于代理的概念,而在于代理的具体实现?也许我们可以帮助您修复该实现。