坑点and埋坑点 - header重定向后不会停止运行

  • 作者:KK

  • 发表日期:2016.10.22


要点速读

header重定向后并不会停止脚本,而是继续向后运行的,所以通常要在header重定向以后进行return或exit等不让程序继续往下跑的措施


正文

以下代码会产生1.txt

header('Location: http://www.baidu.com');
file_put_contents('1.txt', '你看你看,header重定向后,脚本根本没有停止运行嘛');

不信你试试


好多菜鸟对重定向使用不正当

这也是没办法的事,经验有限,header重定向给了他们一种“重定向页面就停止”了的错觉

所以这样的代码虽然感知不到有什么但其实是往下继续读数据,继续display页面了的:

class UserController extends Controller{
	public function info(){
		if(!checkLogin()){
			header('Location:/login.html');
		}
		
		$id = (int)get('id');
		$user = $this->db->table('user')->one($id);
		if(!$user){
			$this->showError('无效的用户ID');
		}
		$this->display('info', [
			'user' => $user,
		]);
	}
}

由于访问时被重定向了,浏览器会实时收到header实时跳转,视觉上已经看不到后续的输出了


其实埋下了一个深坑,太深了

如果重定向后面的代码不是仅仅做查询,而是先做了一些修改的话,这些修改的发生可能是你完全不希望的!

我暂时还没想起什么好案例,不是很记得了,希望大家有案例的话提供一下哈,反正header后面还继续做事,肯定是不好的,万一做了不应该做的事,你懂的

所以虽然情况比较少有,然而一旦发生,基本上就会坑你一脸


正确姿势

在重定向后面进行return或exit等能让程序不再往后面跑的措施

if(!checkLogin()){
	header('Location:/login.html');
	exit; //!!!!重点!!!!
}

$id = (int)get('id');
$user = $this->db->table('user')->one($id);
$this->display('info', [
	'user' => $user,
]);