即使在输出缓冲区内也会发送PHP头文件位置?
我无法从输出缓冲区中抑制PHP位置标题。 我的理解是输出缓冲区应该压缩标题直到它们被刷新。 我也认为不应该使用ob_end_clean()发送头文件。
但是,如果你看到下面的代码,如果我取消注释标题行(第二行),我总是被重定向到谷歌,并从未看到'完成'。
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),但是因为我想要缓冲的所有文件都在我自己的服务器上,所以curl被证明非常慢并且占用了大量的db连接。
有没有人有任何建议或知道任何方式捕捉/抑制位置标题?
谢谢,汤姆
看看你是否可以使用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');
链接地址: http://www.djcxy.com/p/71885.html
上一篇: PHP Header Location gets sent even inside an output buffer?