PHP Header() не работает для перенаправления

Я пытаюсь проанализировать страницу загрузки файлов, а затем, в зависимости от того, какой аргумент был передан в 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).


person Community    schedule 09.03.2012    source источник
comment
Неиспользование html мало что значит. Это ЛЮБОЙ вывод любого вида, который может включать предупреждения php и тому подобное. В тот момент, когда отправляется один байт вывода, независимо от того, сделали ли это вы или PHP, вы получите предупреждение «заголовки уже отправлены».   -  person Marc B    schedule 09.03.2012
comment
Почему <br /> в заголовке Location?   -  person alex    schedule 09.03.2012
comment
Ой, что осталось от ранее, хороший улов. И спасибо за объяснение, Марк Б. Что я могу использовать в качестве альтернативы?   -  person    schedule 09.03.2012
comment
Я не совсем понимаю ваш вопрос, но есть readfile   -  person Raffaele    schedule 09.03.2012
comment
По сути, мой код будет анализировать веб-сайт и находить ссылку, например dl.bukkit.org/downloads/craftbukkit/get/00790_1.1-R6/, который мне нужно автоматически перенаправить на эту ссылку, чтобы начать загрузку.   -  person    schedule 09.03.2012
comment
Возможно, вы сохранили свой файл как UTF-8 с BOM? Эта спецификация появляется в начале документа и включается в вывод. Проверьте что-нибудь вроде Notepad++. Конечно, это относится и к включенному файлу.   -  person Daan    schedule 09.03.2012


Ответы (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);
                }
            }
        }
    }
}
person Community    schedule 09.03.2012
comment
Привет, Бретт, учтите, что несмотря на отправку header($url) и перенаправление браузера пользователей, ваш скрипт все равно будет работать до тех пор, пока он не достигнет логического завершения, в данном случае, пока он не достигнет конца вашего цикла foreach. Добавьте break; после отправки заголовка(). Возможно, это не улучшит скорость скрипта, но снизит нагрузку на ваш сервер после перенаправления пользователя. - person David Barker; 10.03.2012