【问题标题】:Retrieving Data From external Domain从外部域检索数据
【发布时间】:2009-11-05 20:07:10
【问题描述】:

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

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

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

我知道这是可能的,因为我见过。谁有想法 ?? iframe 对我想做的事情有好处吗?有人有资源分享吗??

非常感谢

【问题讨论】:

    标签: php jquery proxy iframe


    【解决方案1】:

    您可以让 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();
    }
    

    【讨论】:

    • 我听说过 iframe,但我不知道从哪里开始。我认为这对我有很大帮助。不确定它是否会起作用。但这似乎是一个好的开始。非常感谢
    • 如果你知道任何其他很好的例子,也许你可以参考我的书或网址,请做和thanx
    • 如果你用谷歌搜索“使用隐藏表单跨域发布数据”会有很多点击,例如w-shadow.com/blog/2008/11/20/cross-domain-post-with-javascript 但技术非常简单。缺点是您无法从帖子中取回任何数据,因此它只是一种单向流。
    • 我试过了,但我认为 ifr.style.display = 'absolute'; 行可能有问题导致我在解析“显示”值时收到错误错误。声明被放弃。不知道这是否会导致它不发送。但它没有发送。我也在使用jquery。所以不确定这是否会导致它。我将数据封装在下面。 $('#testReq').click(function(){ })
    • 给我发一封包含你的源代码的电子邮件(你可以通过我的个人资料找到我的地址),我会看看
    【解决方案2】:

    您是否考虑过使用JSONP 之类的东西?

    【讨论】:

      【解决方案3】:

      将您的数据分成块,以便 getJSON 可以工作。您可以实现数据排队,以便 producer 不断用数据填充队列,而您域上的 consumer 使用 getJSON 将其分成更小的块。它不会是实时的,但您可以尝试一下,看看您对性能是否满意。

      【讨论】:

      • 这似乎是合理的。但是,我确实考虑过。但如果我这样做。我必须让我的服务器知道每个请求都来自同一个会话。如果我不这样做,它可能会在数据库中为每个通过的数据插入一个新行。我必须通过它发送一个 cookie 来标识它来自同一个会话。这似乎是合理的。
      • 或者在客户端生成一个(半)唯一的 id 并与所有部分发送相同的 id。然后,服务器可以连接具有相同 id 的部分。
      【解决方案4】:

      您可以使用 javascript 与 flash 对话,并让 flash 做跨域部分,请参阅http://www.xml.com/pub/a/2006/06/28/flashxmlhttprequest-proxy-to-the-rescue.html

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

      【讨论】:

      • 我也不确定。假设 php 文件不是为收入 Ajax 调用创建的,而是用于传出的。我在我的服务器上使用它在像谷歌这样的网站上尝试过它并且它有效。但是我尝试从进来的 x 域使用它,但没有。
      • 所以问题不在于代理的概念,而在于代理的特定实现?也许我们可以帮助您修复该实施。
      【解决方案5】:

      也许你能比我更好地理解它。我很擅长 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);
      ?>
      

      再次,如果我在我的网站中输入http://mywebsite.com/ajax-proxy.php?csurl=www.google.com。它工作正常。甚至把它放在网址中。工作正常。但是如果您使用 ajax post 从外部服务器调用它。没用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多