2012-05-30 51 views

回答

1

一個很好的例子是this PHP user note解釋,這裏複製爲後人:


ARR1的建議的一個簡單實用的包裝,告訴輸出完成了瀏覽器後繼續 處理。

當一個請求需要一些處理(所以我們不 做兩次上刷新),這使得事情變得簡單,我總是重定向...

<?php 
function redirect_and_continue($sURL) 
{ 
    header("Location: ".$sURL) ; 
    ob_end_clean(); //arr1s code 
    header("Connection: close"); 
    ignore_user_abort(); 
    ob_start(); 
    header("Content-Length: 0"); 
    ob_end_flush(); 
    flush(); // end arr1s code 
    session_write_close(); // as pointed out by Anonymous 
} 
?> 

這是非常有用的任務這需要很長時間,比如轉換視頻或縮放大圖像。

+0

將以同樣的方式實現我自己的重定向()。 – noober

+0

@noober:好的,只記得大部分時間,*在'Location()之後'死掉()'是有意義的!另外,我認爲'session_write_close()'應該放在'Location'頭部之前,而不是末尾。 –

3

我個人認爲你應該在你不希望劇本再被執行的地方打電話die()。如果您不希望在您的header("Location: ...")之後執行腳本,那麼您應該在其之後立即放置die()

基本上,如果你不這樣做,你的腳本可能會做不必要的額外計算,因爲服務器重定向他,永遠不會對用戶「可見」。

+0

好的,那麼您希望在header('Location:')之後執行腳本嗎?任何示例? – noober

+2

在某些情況下,您可能需要做一些額外的計算,存儲一些東西,清理一些資源,並將其命名。有很多用例,但都是基於情境的。如果你不需要在'header(「Location:...」)之後做任何事情'''''''''''''''''''''''''''''''' – Styxxy

4

header('Location: ')會讓HTTP redirect,告訴瀏覽器去到新的位置:

HTTP/1.1 301 Moved Permanently 
Location: http://example.com/another_page.php 
Connection: close 

它不需要任何HTML的身體,因爲瀏覽器將不顯示它,只是跟着重定向。這就是爲什麼我們在header('Location:')之後撥打die()exit()。如果您不終止腳本,則HTTP響應看起來像這樣。

HTTP/1.1 301 Moved Permanently 
Location: http://example.com/another_page.php 
Connection: close 

<!doctype html> 
<html> 
<head> 
    <title>This is a useless page, won't displayed by the browser</title> 
</head> 
<body> 
    <!-- Why do I have to make SQL queries and other stuff 
     if the browser will discard this? --> 
</body> 
</html> 

爲什麼沒有死亡()由PHP解釋自動地進行?

header()函數用於發送原始HTTP頭,不限於header('Location:')。例如:

header('Content-Type: image/png'); 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 
// ...more code... 

在這種情況下,我們不叫die(),因爲我們需要生成HTTP響應體。因此,如果PHP在header()之後自動調用die(),則這是沒有意義的。

相關問題