2011-05-25 27 views
3

我無法從輸出緩衝區中抑制PHP位置標題。我的理解是輸出緩衝區應該壓縮標題直到它們被刷新。我也認爲不應該使用ob_end_clean()發送頭文件。即使在輸出緩衝區內也會發送PHP標頭位置?

但是,如果你看到下面的代碼,如果我取消註釋標題行(第二行),我總是被重定向到谷歌,並從未看到'完成'。

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連接。

有沒有人有任何建議或知道任何方式捕捉/抑制位置標題?

感謝, 湯姆

回答

2

看看您是否可以使用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

(幾乎)完美!令人討厭的是我的服務器運行在PHP 5上。2仍然,但我找到了一個解決方法: foreach($ headers_list作爲$ header) { $ name_pos = strpos($ header,':'); ($ name_pos && strlen($ header)!= $ name_pos) header(substr($ header,0,$ name_pos + 1)); } } 這將刪除所有已設置的標題(最重要的是位置標題)。謝謝您的幫助! – lopsided 2011-05-25 12:22:23

+0

Awww ...剛剛注意到'header_remove'在PHP 5.3.0或更高版本中可用。 – 2011-05-25 13:33:25

0

如果你讀了手冊頁ob_start第一段是:

,此功能將關閉輸出 緩存上。雖然輸出緩衝 處於活動狀態,但沒有輸出從 腳本(除標頭外)發送,而不是 輸出存儲在內部 緩衝區中。

+0

見上面我的意見,湯姆。 – lopsided 2011-05-25 12:29:32

0

這是我的理解是輸出 緩衝區應該抑制頭部,直到 它們被刷新

都能跟得上:

當輸出緩衝是活躍的沒有 輸出從腳本發送(其他 比頭)

來源: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

從我上面的測試和薩爾曼的解決方案驗證,標題不會從輸出緩衝區內發送到瀏覽器。我讀這一行意味着從輸出緩衝區內發送的任何頭文件都會立即應用到父腳本頭文件中,而不管緩衝腳本中發生了什麼。從我所看到的情況來看,情況似乎如此。 Tom – lopsided 2011-05-25 12:28:37

+0

感謝您的幫助! – lopsided 2011-05-25 12:29:42