Php 我自己的站点的文件\u get\u contents()连接被拒绝
我一直在尝试使用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 我自己的站点的文件\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]中的连接被拒
看看你的防火墙设置,它们可能有点太严格了。如果您登录并
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'));
请求URLhttp://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');