【问题标题】:PHP Header() not working for RedirectPHP Header() 不适用于重定向
【发布时间】:2012-03-27 00:38:42
【问题描述】:

我正在尝试解析文件下载页面,然后根据 URL 中传递的参数,自动将它们重定向到适当的下载文件。当我回显它时一切正常,但是当我尝试使用 header() 时它什么也不做。

<?php

require_once('simple_html_dom.php');

$html = file_get_html('http://dl.bukkit.org/downloads/craftbukkit/');

$dom = new DOMDocument;
libxml_use_internal_errors(true);
//echo $dom->loadHTML($html) ? "success<br/>" : "failed<br/>";
libxml_clear_errors();
$dom->preserveWhiteSpace = true;

$version = $_GET['version'];

if($version == "beta")
{
    foreach ($dom->getElementsByTagName('div') as $element)
    {
        if($element->getAttribute('class') == "downloadButton chan-rb  mini")
        {
            foreach ($element->getElementsByTagName('a') as $link)
            {
                if( $link->getAttribute('class') == "tooltipd")
                {
                    $lnk = $link->getAttribute('href')."<br/>";
                    $url = "Location:http://dl.bukkit.org".$lnk;
                    header($url);
                }
            }
        }
    }
}

?>

我相信我遇到了已经发送标头的问题,尽管在此之前我没有使用任何 HTML。是否有任何好的替代方法可以重定向到实际文件(在这种情况下,它们是 .jar 扩展名)。

【问题讨论】:

  • 不使用 html 并没有多大意义。它是任何类型的 ANY 输出,可以包括 php 警告等。在发送单个字节输出的瞬间,无论是您发送的还是 PHP 发送的,您都会收到“标头已发送”警告。
  • 为什么&lt;br /&gt; 在您的Location 标头中?
  • 糟糕,这是之前遗留下来的,很好。感谢 Marc B 的解释。我可以用什么来替代?
  • 我不完全理解你的问题,但是有readfile
  • 基本上我的代码将解析一个网站并找到一个链接,例如dl.bukkit.org/downloads/craftbukkit/get/00790_1.1-R6/…,我需要自动重定向到该链接以开始下载。

标签: php redirect http-headers simple-html-dom


【解决方案1】:

我设法通过删除它所说的提早发送标题信息的所有行来使其工作。这是代码,但如果有人对加快速度有任何建议(速度相当慢),请告诉我!

<?php

require_once('simple_html_dom.php');

$html = file_get_html('http://dl.bukkit.org/downloads/craftbukkit/');

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();
$dom->preserveWhiteSpace = true;

$version = $_GET['version'];

if($version == "beta")
{
    foreach ($dom->getElementsByTagName('div') as $element)
    {
        if($element->getAttribute('class') == "downloadButton chan-beta  mini")
        {
            foreach ($element->getElementsByTagName('a') as $link)
            {
                if( $link->getAttribute('class') == "tooltipd")
                {
                    $url = "Location:http://dl.bukkit.org".$link->getAttribute('href');
                    header($url);
                }
            }
        }
    }
}

【讨论】:

  • 嗨,Brett,考虑到发送header($url) 并重定向用户浏览器,您的脚本仍将运行,直到得出合乎逻辑的结论,在这种情况下,直到它到达您的@987654323 结尾@ 环形。发送 header() 后添加break;。这可能不会提高脚本的速度,但会在用户被重定向后减少服务器上的负载。
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2012-11-17
  • 2011-04-14
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多