Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我自己的站点的文件\u get\u contents()连接被拒绝_Php_Curl - Fatal编程技术网

Php 我自己的站点的文件\u get\u contents()连接被拒绝

Php 我自己的站点的文件\u get\u contents()连接被拒绝,php,curl,Php,Curl,我一直在尝试使用CURL和PHP file_get_contents()函数连接到我自己的站点,以获取我的网页的源代码,但没有成功。我在试图从中获取HTML源代码的同一台服务器上运行PHP脚本。CURL不会返回任何错误,即使在使用CURL\u error()时也不会,PHP file\u get\u contents()函数会返回以下内容: 警告:文件获取内容([sitename])[function.file get contents]:无法打开流:第19行的[file path]中的连接被拒

我一直在尝试使用CURL和PHP file_get_contents()函数连接到我自己的站点,以获取我的网页的源代码,但没有成功。我在试图从中获取HTML源代码的同一台服务器上运行PHP脚本。CURL不会返回任何错误,即使在使用CURL\u error()时也不会,PHP file\u get\u contents()函数会返回以下内容:

警告:文件获取内容([sitename])[function.file get contents]:无法打开流:第19行的[file path]中的连接被拒绝

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

谢谢

编辑:

以下是我的(cURL)代码供参考:


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

telnet localhost 80
还是您选择的操作系统的等效版本?并尝试不使用localhost,而是使用服务器的完整ip。只有成功了,才会出现curl/php问题

编辑:确定,使用
file\u get\u contents(
file\u get\u contentshttp://localhost/");

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

curl_setopt(CURLOPT_HTTPHEADER,array('Host: yourdomain.com'));
请求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);
}
$ip='127.0.0.1';
$fp=fsockopen($ip,80,$errno,$errstr,5);
$result='';
如果(!$fp){
回显“$errstr($errno)
\n”; }否则{ $out=“GET/HTTP/1.1\r\n”; $out.=“主机:www.exampl.com\r\n”; $out.=“连接:关闭\r\n\r\n”; fwrite($fp,$out); 而(!feof($fp)){ $result.=fgets($fp,128); } fclose($fp); }

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

我以前在与托管公司使用共享服务器时遇到过这个问题,因为许多功能都已关闭。您是否在共享服务器上/是否免费获得主机

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

<?php

// Show all information
phpinfo();

?>

确保已从php.ini打开。

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

最有可能是因为您的站点指向公共ip,而公共ip又映射到内部ip,就像MVD指出的那样

www.domain.com=234.234.234.234

服务器ip:10.0.0.1

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

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

你的选择是:

  • 让提供商在防火墙中为其外部IP设置正确的路由。这是可行的,但往往错过,因为它很少需要。有一个理由认为这是可行的,因为您无法访问与您现在所在网段相同的其他站点

  • 告诉提供商将www.domain.com->
    127.0.0.1
    添加到服务器上的主机文件中

  • 在仍然连接到本地主机时,使用您自己的套接字代码“伪造”主机头。PHP中有很多这样的示例类,mvds已经给了您一个示例

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


  • 整个问题是将这一行添加到hosts文件(/etc/hosts)


    感谢吉石!:)

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

    file_get_contents('/home/usr/public_html/path/page.html');
    
    文件名路径将从一台服务器更改到另一台服务器,但您应该了解这一点。

    在我的路径中,“/usr/”是帐户的用户名。

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

    file_get_contents('page.html');
    

    +1-正常情况下,
    localhost
    可以工作,但通常使用实际的服务器名或公共IP无法工作。许多防火墙/路由器不允许实质上通过路由器“环回”的请求。恐怕我没有远程登录网络服务器的权限。我是否可以用PHP命令来模拟/测试它。。这基本上就是你正在做的;-)尝试连接到本地主机(或
    127.0.0.1
    ,或
    0.0.0
    ,所有这些都一样),然后查看发生了什么。如果您在共享主机环境中,您将得到一些错误响应,但至少您知道您具有连接性。例如
    file\u get\u contents(“http://127.0.0.1/");好的,明白了。按照你的建议,我得到了一张空白页。没有错误消息,没有输出,什么都没有(错误报告处于打开状态)。所以这次没有连接错误?可能是您的Web服务器在没有主机名的情况下会这样做;如果您使用它的ip地址从家中访问它会发生什么?i、 e.将浏览器指向
    http://1.2.3.4/
    CURL在与其他站点一起使用时启用。事实上,我正在使用共享主机,我想这就是为什么它不工作的原因。是的,我似乎记得在我的共享主机上有完全相同的问题。我不知道你是否已经考虑过了,但是你可以用fopen来代替吗?我已经编辑了上面的文章。恐怕不是,因为我是在看输出,而不是内容。嗯,我能看到的唯一其他方法是使用include(如果是PHP文件),然后直接调用函数。我真的认为你需要cURL才能做到你所说的。也许是请求你的主机提供商打开它?嗯,我可以试着把它包括进去。这将是一个b位
    127.0.0.1 example.com www.example.com
    
    file_get_contents('/home/usr/public_html/path/page.html');
    
    file_get_contents('page.html');