file_get_contents 不适用于某些 url

Posted

技术标签:

【中文标题】file_get_contents 不适用于某些 url【英文标题】:file_get_contents is not working for some url 【发布时间】:2013-06-26 03:48:07 【问题描述】:

我在 php 中使用file_get_contents。在下面的代码中,第一个 URL 工作正常,但第二个不工作。


$URL = "http://test6473.blogspot.com";
$domain = file_get_contents($URL);
print_r($domain);


$add_url= "http://adfoc.us/1575051";
$add_domain = file_get_contents($add_url);
echo $add_domain;

关于为什么第二个不起作用的任何建议?

【问题讨论】:

那么第二个 url 实际上回显的是什么?还是您收到任何错误消息? “不工作”是什么意思? 请在浏览器中打开这两个网址。两者都返回 html 页面。 也许,他们阻止了非浏览器请求:P @DBK 如果是这样的话,还有其他选择吗? 【参考方案1】:

file_get_contents 没有检索到的 URL,因为他们的服务器会检查请求是来自浏览器还是来自任何脚本。如果他们发现来自脚本的请求,他们只会禁用页面内容。

所以我必须发出类似于浏览器请求的请求。所以我使用以下代码来获取第二个 url 内容。对于不同的 Web 服务器,它可能会有所不同。因为他们可能会保留不同的支票。

尽管您为什么不尝试使用以下代码!如果你幸运的话,这可能对你有用!

function getUrlContent($url) 
    fopen("cookies.txt", "w");
    $parts = parse_url($url);
    $host = $parts['host'];
    $ch = curl_init();
    $header = array('GET /1575051 HTTP/1.1',
        "Host: $host",
        'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language:en-US,en;q=0.8',
        'Cache-Control:max-age=0',
        'Connection:keep-alive',
        'Host:adfoc.us',
        'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',
    );

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($ch, CURLOPT_COOKIESESSION, true);

    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;


$url = "http://adfoc.us/1575051";
$html = getUrlContent($url);

感谢大家的指导。

【讨论】:

我还想提一下,文件 get_contents 不会启动任何会话或设置通常由 curl/浏览器完成的 cookie。 是否需要cookies.txt 文件? @hnn 仅当您要调用的URL 在浏览器中维护任何cookie 时才需要。 当我使用 maps.googleapis.com/maps/api/geocode/… 之类的方式调用 Google 地图时没有得到任何响应时,这对我有用【参考方案2】:

不幸的是,第二个站点似乎阻止了来自无法识别的浏览器的访问。即使从命令行使用 curl 也不起作用:

curl -I http://adfoc.us/1575051

给予:

HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Fri, 28 Jun 2013 12:15:40 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.5.0
Set-Cookie: __cfduid=d7cd1bf18c136a288cc2b36065a3b31f01372421740; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.adfoc.us
CF-RAY: 85a4dc6829e06d0

但没有内容。请注意,它返回状态 200,因此如果您检查返回的字符串是否为 boolean === false 以查看它是否失败,它实际上看起来好像它已经工作了。

如果您需要欺骗用户代理(可能还有其他东西)以尝试获取 url 以接受您的请求,您需要尝试使用 curl 库并尝试不同的组合以尝试使其正常工作。首先尝试看看 curl 命令行的工作原理,这也是减少调查开发时间的好方法。

这是以前经历过的人:

php curl: how can i emulate a get request exactly like a web browser?

【讨论】:

感谢您的回答。我试过给出另一个答案的网址。但它仍然无法正常工作。 :( 不幸的是,每个网站都不同 - 您可能需要尝试各种不同的 http 标头,然后才能获得该网站接受的一个...或者它可能永远无法工作...或者您可能甚至需要cookie支持欺骗。不幸的是,你只能在这里做试验和错误——这种事情变得越来越难做:(【参考方案3】:

看起来第二个 url 有时回答太慢了,可能有重定向。 尝试使用 curl 并设置更大的超时。 另外,打开错误

error_reporting(-1);
ini_set('display_errors','On');

【讨论】:

【参考方案4】:

你也可以试试这个代码

<?php

function getUrlContent($url) 
    $parts = parse_url($url);
    $host = $parts['host'];
    $ch = curl_init();
    $header = array('GET /1575051 HTTP/1.1',
        "Host: $host",
        'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language:en-US,en;q=0.8',
        'Cache-Control:max-age=0',
        'Connection:keep-alive',
        'Host:adfoc.us',
        'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',
    );

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;


$url = "https://news.google.com/rss/search?q=apple&hl=en-IN&gl=IN&ceid=IN:en";
$html = getUrlContent($url);

$xml = simplexml_load_string($html);
$json = json_encode($xml);
$array = json_decode($json,TRUE);


print_r($array);
?>

【讨论】:

以上是关于file_get_contents 不适用于某些 url的主要内容,如果未能解决你的问题,请参考以下文章

长路径 \\?\ 解决方法不适用于某些安装

Spring Security permitAll 不适用于某些端点

自定义通知托盘不适用于某些手机

Web 视图不适用于某些特定的 url

Openweathermap 不适用于某些国家/地区?

YFinance -tickerData.info 不适用于某些股票