1

我想做的是使用 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 目标主机被禁止

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

4

2 回答 2

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 变量...

于 2012-07-01T12:37:50.780 回答
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 或任何其他方式执行此操作,除非您与网络管理员一起清除此问题。

于 2012-07-02T11:51:57.733 回答