什么时候应该调用header('Location')而不用die()?

时间:2012-05-30 23:12:08

标签: php redirect http-headers location die

header('Location:')之后调用die()之后是否有意义?

如果没有,为什么PHP解释器不会自动执行die()?如果是,何时?

3 个答案:

答案 0 :(得分:4)

header('Location: ')会让HTTP redirect告诉浏览器转到新位置:

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

它不需要任何HTML正文,因为浏览器不会显示它,只是按照重定向。这就是我们在die()之后致电exit()header('Location:')的原因。如果不终止脚本,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解释器自动执行die()?

header()函数用于发送原始HTTP标头,不限于header('Location:')。例如:

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

在这种情况下,我们不会调用die(),因为我们需要生成HTTP响应主体。因此,如果PHP在die()之后自动调用header(),则没有意义。

答案 1 :(得分:3)

在我个人看来,你应该在不希望脚本被执行的时候调用die()。如果您不希望在header("Location: ...")之后执行脚本,则应将die()放在其后面。

基本上,如果你不这样做,你的脚本可能会进行不必要的额外计算,这对用户来说永远不会“可见”,因为无论如何服务器都会重定向他。

答案 2 :(得分: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 
 } 
?>

这对于需要很长时间的任务非常有用,例如转换视频或缩放大图像。