PHP标头位置是否在输出缓冲区内发送?

| 我无法从输出缓冲区中抑制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来做到这一点(将follow重定向设置为false),但是由于我要缓冲的所有文件都在我自己的服务器上,因此curl的运行速度非常缓慢,并且占用了数据库连接的负载。 是否有人对捕获/抑制位置标头有任何建议或了解? 谢谢, 汤姆     
已邀请:
看看是否可以同时使用
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将在即将发送输出的第一个字节时(或在脚本终止时)发送标头。没有输出缓冲,您的代码必须在发送任何输出之前操纵标头。使用输出缓冲,您可以交错头操作并根据需要随意输出,直到刷新缓冲区为止。     
如果您阅读ob_start的手册页,则第一段为:   此功能将打开输出   缓冲。输出缓冲时   处于活动状态,没有从发送任何输出   脚本(标头除外)代替   输出存储在内部   缓冲。     
  据我了解,输出   缓冲区应抑制标题,直到   他们被冲洗了 不:   当输出缓冲处于活动状态时   输出是从脚本发送的(其他   比标题) 来源: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\');
    

要回复问题请先登录注册