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

CJD*_*CJD 6 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;
Run Code Online (Sandbox Code Playgroud)

mvd*_*vds 9

看看你的防火墙设置,它们可能有点过于严格.如果您登录并且会发生什么

telnet localhost 80
Run Code Online (Sandbox Code Playgroud)

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

编辑:好的,所以连接到localhost工作,使用file_get_contents("http://localhost/");.

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

curl_setopt(CURLOPT_HTTPHEADER,array('Host: yourdomain.com'));
Run Code Online (Sandbox Code Playgroud)

请求URL http://127.0.0.1/.我想知道这是否会被curl理解,但你可以试一试.

编辑^ 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);
}
Run Code Online (Sandbox Code Playgroud)

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


jis*_*shi 5

很可能是因为您的站点指向公共IP,而后者又映射到内部IP,如mvds指出的那样.

www.domain.com = 234.234.234.234

server ip:10.0.0.1

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

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

你的选择是:

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

  2. 告诉您的提供商127.0.0.1在服务器上的hosts文件中添加www.domain.com - >

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

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