撥打header('Location:')
沒有die()
之後它有意義嗎?什麼時候應該在不用die()的情況下調用header('Location')?
如果沒有,爲什麼die()
不是由PHP解釋器自動執行的?如果是,何時?
撥打header('Location:')
沒有die()
之後它有意義嗎?什麼時候應該在不用die()的情況下調用header('Location')?
如果沒有,爲什麼die()
不是由PHP解釋器自動執行的?如果是,何時?
一個很好的例子是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
}
?>
這是非常有用的任務這需要很長時間,比如轉換視頻或縮放大圖像。
我個人認爲你應該在你不希望劇本再被執行的地方打電話die()
。如果您不希望在您的header("Location: ...")
之後執行腳本,那麼您應該在其之後立即放置die()
。
基本上,如果你不這樣做,你的腳本可能會做不必要的額外計算,因爲服務器重定向他,永遠不會對用戶「可見」。
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()
,則這是沒有意義的。
將以同樣的方式實現我自己的重定向()。 – noober
@noober:好的,只記得大部分時間,*在'Location()之後'死掉()'是有意義的!另外,我認爲'session_write_close()'應該放在'Location'頭部之前,而不是末尾。 –