坑点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,
]);