检索跨域数据php

时间:2012-07-01 12:21:58

标签: php proxy cross-domain

我想做的是从维基百科中使用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禁止日期:星期一,2012年7月2日09:41:20 GMT服务器:Apache内容类型:text / plain目的地主机禁止

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

2 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分:2)

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

<?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或任何其他方式执行此操作。