我自己的网站拒绝file_get_contents()连接

时间:2010-07-19 18:46:02

标签: php curl

我一直在尝试使用CURL和PHP file_get_contents()函数连接到我自己的网站,以获取我的网页来源而没有成功。我正在尝试从中获取HTML源的同一台服务器上运行PHP脚本。 CURL不返回任何错误,即使使用curl_error()也没有,并且PHP file_get_contents()函数返回以下内容:

  

警告:file_get_contents([sitename])[function.file-get-contents]:无法打开流:第19行的[文件路径]中的连接被拒绝。

我不知道为什么会这样。为什么服务器会主动拒绝此连接?我怎么能阻止它?

由于

编辑:

这里的参考是我的(cURL)代码:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.mydomain.co.uk');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, '');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: www.mydomain.co.uk')); 

$rawHTML = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);

print $err;
print 'HTML: ' . $rawHTML;

7 个答案:

答案 0 :(得分:9)

看看你的防火墙设置,它们可能有点过于严格。如果您登录并

会发生什么
telnet localhost 80

或您选择的操作系统的等效物?并尝试使用localhost而不是服务器的完整ip。只有成功,你才会遇到curl / php问题。

编辑好,所以使用localhostfile_get_contents("http://localhost/");的联系有效。

这意味着您可以通过localhost访问您的站点,但您需要覆盖随请求发送的Host:字段。这不是cURL的正常用法,但您可以尝试:

curl_setopt(CURLOPT_HTTPHEADER,array('Host: yourdomain.com'));
请求网址http://127.0.0.1/

。我想知道这是否会被卷曲理解,但你可以试一试。

编辑^ 2:如果这不能欺骗cURL,只需打开自己的套接字连接并提出自己的请求:

$ip = '127.0.0.1';
$fp = fsockopen($ip, 80, $errno, $errstr, 5);
$result = '';
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.exampl.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $result .= fgets($fp, 128);
    }
    fclose($fp);
}

(这是来自php.net示例的改编)

答案 1 :(得分:5)

最有可能的原因是您的站点指向公共IP,而后者又映射到内部IP,如mvds所指出的。

  

www.domain.com = 234.234.234.234

     

服务器ip:10.0.0.1

防火墙从外部网络映射234.234.234.234 -> 10.0.0.1,但不从内部流量映射。

因此,您需要使用本地IP或localhost(127.0.0.1)连接到您的计算机,但仍需要维护主机标头(www.domain.com)。

您的选择是:

  1. 让您的提供商在其防火墙中为其外部IP设置正确的路由。这是可行的,但经常错过,因为它很少需要。这个问题的一个论点是因为您无法访问与您现在位于同一网段的其他网站。

  2. 告知您的提供商添加www.domain.com - &gt;服务器上hosts文件中的127.0.0.1

  3. 使用您自己的套接字代码“伪造”主机标头,同时仍然连接到localhost。在PHP中有很多这样的示例类,mvds已经为您提供了一个示例。

  4. 找到另一种获取信息的方法。它在同一台服务器上,不是吗?通过http获取它似乎是多余的......

答案 2 :(得分:4)

整个问题是将此行添加到主机文件(/ etc / hosts)

127.0.0.1 example.com www.example.com

感谢jishi! :)

答案 3 :(得分:0)

我在使用托管公司的共享服务器之前遇到过这个问题,因为很多功能都已关闭。你是在共享服务器/你是免费获得托管?

在PHP配置中检查服务器上是否也启用了cURL。

<?php

// Show all information
phpinfo();

?>

如果您尝试访问的数据位于同一服务器上,则可以使用fopen:

$myFile = "testFile.txt";
$fh = fopen($myFile, 'r');
$theData = fread($fh, 5);
fclose($fh);
echo $theData;

http://php.net/manual/en/function.fopen.php

答案 4 :(得分:0)

确保您已从php.ini中启用allow_url_fopen

答案 5 :(得分:0)

可能是一个愚蠢的问题,但你没有设置.htaccess密码吗?如果您的浏览器存储它可能会忘记,但PHP服务器没有它,但仍然需要它来访问该站点。几乎可以肯定没有,但也许值得建议。

答案 6 :(得分:0)

检索本地文件的最简单方法是使用本地路径。

file_get_contents('/home/usr/public_html/path/page.html');

文件名路径将从一台服务器更改为另一台服务器,但您应该明白这一点。

在我的路径中&#34; / usr /&#34;是帐户的用户名。

或者,如果脚本位于页面的同一目录中,则可以使用:

file_get_contents('page.html');