Расположение заголовка PHP отправляется даже внутри буфера вывода? - PullRequest
3 голосов
/ 25 мая 2011

У меня проблемы с подавлением заголовка местоположения PHP из буфера вывода. Насколько я понимаю, выходные буферы должны подавлять заголовки, пока они не будут сброшены. Я также думал, что никакие заголовки не должны отправляться с ob_end_clean ().

Однако, если вы видите код ниже, если я раскомментирую строку заголовка (вторая строка), я всегда перенаправляюсь в Google и никогда не вижу «готово».

ob_start();
//header("Location: http://www.google.com");
$output = ob_get_contents();
ob_end_clean();

$headers_sent = headers_sent();
$headers_list = headers_list();

var_dump($headers_sent);
var_dump($headers_list);

die('finished');

Мне нужно подавить любые перенаправления заголовков, в идеале перехватывать их в выходном буфере, чтобы я знал, что эти условия вызовут перенаправление. Я знаю, что могу сделать это с помощью curl (установив для перенаправления false значение false), но поскольку все файлы, которые я хочу буферизовать, находятся на моем собственном сервере, curl работает очень медленно и связывает нагрузку с соединениями БД.

Кто-нибудь имеет какие-либо предложения или знает какой-либо способ отлова / подавления заголовков местоположения?

Спасибо, Том

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

Проверьте, можете ли вы использовать функцию header_remove вместе с headers_list.Кажется, это работает на IIS / FastCGI и Apache:

<?php
ob_start();
header('Location: http://www.google.com');
$output = ob_get_contents();
ob_end_clean();
foreach(headers_list() as $header) {
    if(stripos($header, 'Location:') === 0){
        header_remove('Location');
        header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); // Normally you do this
        header('Status: 200 OK');                        // For FastCGI use this instead
        header('X-Removed-Location:' . substr($header, 9));
    }
}
die('finished');

// HTTP/1.1 200 OK
// Server: Microsoft-IIS/5.1
// Date: Wed, 25 May 2011 11:57:36 GMT
// X-Powered-By: ASP.NET, PHP/5.3.5
// X-Removed-Location: http://www.google.com
// Content-Type: text/html
// Content-Length: 8

PS: несмотря на то, что сказано в документации ob_start, PHP будет отправлять заголовки, когда собирается отправить первый байт вывода (или когда скриптэто заканчивается).Без буферизации вывода ваш код должен манипулировать заголовками перед отправкой любого вывода.С буферизацией вывода вы можете чередовать манипуляции с заголовками и выводить их так, как вам нравится, пока вы не очистите буфер.

0 голосов
/ 25 мая 2011

Я так понимаю, что выход буферы должны подавлять заголовки до они покраснели

Нету:

Пока активна выходная буферизация вывод отправляется из скрипта (другой чем заголовки)

Источник: http://us.php.net/manual/en/function.ob-start.php

Вы можете попробовать очистить перед отправкой заголовков, хотя:

ob_start();
flush();
header("Location: http://www.google.com");
$output = ob_get_contents();
ob_end_clean();

$headers_sent = headers_sent();
$headers_list = headers_list();

var_dump($headers_sent);
var_dump($headers_list);

die('finished');
0 голосов
/ 25 мая 2011

Если вы прочитали страницу руководства для ob_start , первый абзац будет:

Эта функция включит буферизацию вывода.Пока активна буферизация вывода, из скрипта (кроме заголовков) не выводятся выходные данные, а вывод сохраняется во внутреннем буфере.

...