如何使用php从另一台主机服务器检索http页面并检测重定向

时间:2009-12-29 16:41:21

标签: php redirect

假设我在www.myhost.com上有一台服务器。从那里通过使用PHP我想要检索php文件www.anotherhost.com/somefile.php生成的html文档。我也想用php来做这件事。 anotherhost与myhost不在同一台服务器上。

我知道fopen,f_get_contents和file等函数只需执行例如即可。

$fp = fopen ("http://www.anotherhost.com/somefile.php")

从那里fp可以用作任何其他文件指针来读取内容。

但是,出于某种原因,我还想知道当我试图检索somefile.php生成的html文档时,anotherhost上的somefile.php是否订购了客户端重定向。 somefile.php可以通过

完成
header ("Location: http://www.anotherhost.com/extrafile.php")

现在fopen将检索extrafile.php生成的html文档,而不检测是否已执行客户端重定向。

PHP中是否有一些功能可以让您从其他服务器检索html文档,并在重定向发生时通知您?如果我必须自己遵循重定向(不是自动完成),只要我被告知新的URL是什么,这是可以接受的。

不建议使用功能系统执行任意命令。

PS。如果你打算建议fsockopen,那么请解释为什么我收到错误“无法找到套接字传输”http“ - 你在配置PHP时忘了启用它吗?”当我尝试执行时

fsockopen ("http://localhost")

当我做

时,我也得到“无法解析地址”localhost“
fsockopen ("localhost")

感谢阅读。非常感谢帮助。

5 个答案:

答案 0 :(得分:2)

您可以使用Zend Framework中的Zend_Http_Client。它具有检索重定向数量的方法,以及设置要遵循的重定向数量的限制等。如果您只是想知道它是如何完成的,那么您可以查看源代码并尝试弄清楚它。我想不应该太难。

答案 1 :(得分:1)

我会使用cURL。如果在标头中指定了重定向,而不是例如apache mod_rewrite,那么您应该能够通过抓取响应发送的所有标头来检测是否存在重定向。

可选择自动跟随重定向(http://us.php.net/manual/en/function.curl-setopt.php)。

答案 2 :(得分:0)

您可能需要完整的HTTP客户端,而不是流包装器和fopen()/ file_get_contents()。我认为使用stream_get_meta_data()可以使用流包装器做你想做的事情,但是你可以通过更全面的实现来做得更好。

答案 3 :(得分:0)

如果您不想沿着Zend或流路线走下去,您可以随时使用cURL functions。这些将允许您返回标题,因此您可以分析这些以确定是否发出任何重定向。

(您也可以使用'CURLOPT_MAXREDIRS'选项指定它不应该遵循重定向。)

答案 4 :(得分:0)

从php 5.2开始,您可以使用流api和stream_notification_callback

e.g。

function notification($code, $severity, $message, $mcode, $transferred, $max) {
  if ( STREAM_NOTIFY_REDIRECTED===$code ) {
    echo 'redirected to ', $message, "\n";
  }
}
$ctx = stream_context_create(null, array('notification' => 'notification'));
$c = file_get_contents("http://spiegel.de", false, $ctx);
echo 'len=', strlen($c);

打印

redirected to http://www.spiegel.de/
len=144446