在pastebin URL上调用file()失败,但在本地文件或google.com上有效


Calling file() on pastebin URL fails, but on local file or google.com it works

我正在处理一些PHP代码,这些代码依赖于一个恰好托管在pastebin上的远程文件。我正在使用的服务器启用了所有必要的功能,因为在将FILE_URL设置为http://google.com的情况下运行它将返回预期的结果。我也通过php.ini验证了额外的措施。

所有应该工作,但它没有。在这样的URL (http://pastebin.com/raw.php?i=<paste id here>)上调用file(),将返回一个500服务器错误。在本地或google.com托管的完全相同的文件上执行相同的操作将返回合理的结果。

我已经验证了URL是否设置为正确的值,并验证了远程页面是否在我认为的位置。我很困惑。

ini_set("allow_url_fopen", true);
// Prefer remote (up-to-date) file, fallback to local file
if( ini_get("allow_url_fopen") ){
    $file = file( FILE_URL );
}
if(!isset( $file ) || !$file ) {
    $file = file( LOCAL_FILE_PATH );
}

我无法测试这个,但你应该使用curl,尝试这样做:

<?php
$url = "http://pastebin.com/2ZdFcEKh";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);

Pastebin似乎使用了一种保护系统,可以自动阻止发出"类机器人"请求的IP地址。

在您的示例中,您将得到一个500服务器错误,因为file()命令从未完成(因为它们的保护系统从未关闭连接),并且在您的调用中没有超时功能。该脚本可能被认为是"类机器人",因为file()不通过所有标准的HTTP头一个典型的浏览器会。

要解决这个问题,我建议研究一下cURL,也许可以考虑设置一个浏览器用户代理作为起点,以授予对脚本的访问权限。我还应该提到,调查这是否被视为违反Pastebin用户协议符合您的利益。虽然我在他们的FAQ(截至2012年12月29日)中没有看到任何关于使用脚本的参考,但他们已经安装了针对脚本的保护。