【问题标题】:Retrieving cross-domain data php检索跨域数据php
【发布时间】:2012-07-02 04:08:38
【问题描述】:

我想做的是使用 ajax 从维基百科检索一些数据。之后我离开了客户端脚本并尝试检索一些随机内容。我尝试了 fopen() 和 fread() 方法,但没有成功,然后我找到了一些文章,其中包含使用代理的互联网提供商的代码。由于这是我的情况,我尝试了下面的代码,但没有给出任何响应。

<?php
$opts = array('http' => array('proxy' => 'tcp://10.10.10.101:8080', 'request_fulluri' => true));
$context = stream_context_create ($opts);
$data = file_get_contents('http://www.php.net', false, $context);   
echo $data;
?>

好的,所以我尝试了建议的代码,并使用了正确的代理值:

<?php


$url = 'http://www.php.net';
$proxy = '10.10.10.101:8080';
//$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

但它给了我这个错误:HTTP/1.0 403 Forbidden Date: Mon, 02 Jul 2012 09:41:20 GMT Server: Apache Content-Type: text/plain 目标主机被禁止

我不明白为什么它不起作用,以及如何解决问题。

【问题讨论】:

    标签: php proxy cross-domain


    【解决方案1】:

    我刚刚测试了您的代码 - 只需使用我自己的代理地址 - 它可以工作。

    <?php
        $url = 'http://www.php.net';
        $proxy = '192.168.4.200:3128';
        //$proxyauth = 'user:password';
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_PROXY, $proxy);
        //curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        $curl_scraped_page = curl_exec($ch);
        curl_close($ch);
    
        echo $curl_scraped_page;
    ?>
    

    所以,您看到的可能是代理本身,它不允许(某些 - 或所有外部?)站点被访问。也许您只需要使用代理进行身份验证。

    这可能意味着您将无法通过 get_contents、curl、fsockopen 或任何其他方式执行此操作,除非您与网络管理员一起清除此问题。

    【讨论】:

      【解决方案2】:

      这不是真正的跨域问题,因为您是从服务器而不是浏览器加载数据。

      要通过代理从 PHP 加载网页 - 最好使用 cURL(PHP http 客户端:http://php.net/manual/en/book.curl.php)。

      这是一个示例 - 它取自一个类似的问题 (http://stackoverflow.com/questions/5211887/how-to-use-curl-via-a-proxy):

      <?php
      
      
      $url = 'http://www.php.net';
      $proxy = '10.10.10.101:8080';
      //$proxyauth = 'user:password';
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL,$url);
      curl_setopt($ch, CURLOPT_PROXY, $proxy);
      //curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_HEADER, 1);
      $curl_scraped_page = curl_exec($ch);
      curl_close($ch);
      
      echo $curl_scraped_page;
      

      如果您的代理需要身份验证 - 您可以设置 $proxyauth var...

      【讨论】:

      • 我试过了,但它输出 403 错误:HTTP/1.0 403 Forbidden Date: Mon, 02 Jul 2012 09:41:20 GMT Server: Apache Content-Type: text/plain 目标主机被禁止
      猜你喜欢
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2016-06-06
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多