我想做的是从维基百科中使用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目的地主机禁止
我不明白为什么它不起作用,以及我如何解决问题。
答案 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或任何其他方式执行此操作。