簡體   English   中英

PHP Header 即使在 output 緩沖區內也能發送位置?

[英]PHP Header Location gets sent even inside an output buffer?

我無法從 output 緩沖區內抑制 PHP 位置 Header。 據我了解,output 緩沖區應該抑制標頭,直到它們被刷新。 我還認為不應使用 ob_end_clean() 發送任何標頭。

但是,如果您看到下面的代碼,如果我取消注釋 header 行(第二行),我總是會被重定向到谷歌並且永遠不會看到“完成”。

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');

我需要抑制任何 header 重定向,最好在 output 緩沖區中捕獲它們,所以我知道這些條件會產生重定向。 我知道我可以用 curl 來做到這一點(將跟隨重定向設置為 false),但由於我想要緩沖的所有文件都在我自己的服務器上 curl 被證明非常慢並且占用了大量的數據庫連接。

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

謝謝,湯姆

看看你是否可以使用header_remove function 和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 將在即將發送 output 的第一個字節時(或腳本終止時)發送標頭。 如果沒有 output 緩沖,您的代碼必須在發送任何 output 之前操作標頭。 使用 output 緩沖,您可以隨意交錯 header 操作和 output 直到您刷新緩沖區。

如果您閱讀ob_start的手冊頁,第一段是:

這個 function 將打開 output 緩沖。 雖然 output 緩沖處於活動狀態,但不會從腳本發送 output (標題除外) ,而是將 output 存儲在內部緩沖區中。

據我了解,output 緩沖區應該抑制標頭,直到它們被刷新

沒有:

雖然 output 緩沖處於活動狀態,但不會從腳本發送 output(標題除外)

來源: 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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM