2

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

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

4

3 回答 3

4

header('Location: ')将进行HTTP 重定向,告诉浏览器转到新位置:

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 响应正文。die()所以如果 PHP 自动调用after是没有意义的header()

于 2012-05-30T23:21:03.787 回答
3

在我个人看来,您应该die()在不想再执行脚本时调用。如果您不希望脚本在您之后执行,您header("Location: ...")应该die()在它之后立即执行。

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

于 2012-05-30T23:15:07.897 回答
1

这个 PHP 用户说明中解释了一个很好的例子,复制到这里以供后代使用:


在告诉浏览器输出完成后继续处理的 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 
 } 
?>

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

于 2012-05-30T23:33:33.190 回答