1,PHP的header()函数,可以实现页面跳转,如
header("Location: " . $url);
但它有个缺点,一旦HTTP报头块已经发送,就不能使用 header() 函数,来发送其它的标头。
这个时候只能利用前端HTML或JS技术来实现页面跳转了!
怎样知道HTTP报头块已经发送了呢?
PHP的 headers_sent() 函数,可以帮忙。
PHP headers_sent() 函数
headers_sent() 函数检查 HTTP 标头是否已被发送以及在哪里被发送。
如果报头已发送,则返回 true,否则返回 false。
语法
headers_sent(file,line)
-
<?php
-
// 如果报头未发送,则发送一个
-
if (!headers_sent()) {
-
header("Location: http://www.w3school.com.cn/");
-
exit;
-
}
-
?>
function redirect($url, $time = 0, $msg = '') {
$url = str_replace(array("\n", "\r"), '', $url); // 多行URL地址支持
if (empty($msg)) {
$msg = "系统将在 {$time}秒 之后自动跳转到 {$url} !";
}
if (headers_sent()) {
$str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
if ($time != 0) {
$str .= $msg;
}
exit($str);
} else {
if (0 === $time) {
header("Location: " . $url);
} else {
header("Content-type: text/html; charset=utf-8");
header("refresh:{$time};url={$url}");
echo($msg);
}
exit();
}
}
原文参考:https://blog.csdn.net/qq_16619037/article/details/51094133
thinkphp中的页面跳转:
if($user=='admin' && $pwd=='123'){
// 如果成功则跳到index/index页面
$this->success('登陆成功',url('/index/index'));
}else{
$this->error('登陆失败');
}
系统的success方法说明
/**
* 操作成功跳转的快捷方法
* @access protected
* @param mixed $msg 提示信息
* @param string $url 跳转的 URL 地址
* @param mixed $data 返回的数据
* @param int $wait 跳转等待时间
* @param array $header 发送的 Header 信息
* @return void
* @throws HttpResponseException
*/
protected function success($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
{}
跳转成功的页面效果:success()方法会有一个等待时间的界面,然后跳到/index/index,同样error()方法同样有个等待界面
修改跳转界面 上面显示登陆成功的界面可能不符合我们的需求,所以需要修改一下这个模板界面
1.修改模板界面,首先需要找到这个模板界面,打开config.php我们可以看到有下面两行代码
// 默认跳转页面对应的模板文件
'dispatch_success_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl', //成功跳转的界面
'dispatch_error_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl', //失败跳转的界面
通过上面的代码我们可以看出,不管是成功跳转还是失败跳转,他都是同一个界面,dispatch_jump.tpl,我们通过目录thinkphp\tpl\dispatch_jump.tpl找到这个文件
然后修改文件的代码,下面我贴出关键的信息
<!--根据code来判断显示成功还是失败,1代表成功,0代表失败-->
<?php switch ($code) {?>
<?php case 1:?>
<h1>:)</h1>
<!--这行代码是我自己在static下添加的一张成功的笑脸图片,路径是根据入口文件的位置来定义图片的位置,入口文件和static是同一级目录-->
<img src="/static/xiao.jpg" width="100px" height="100px">
<p class="success"><?php echo(strip_tags($msg));?></p>
<?php break;?>
<?php case 0:?>
<h1>:(</h1>
<!--这行代码是我自己在static下添加的一张失败的哭脸图片,路径是根据入口文件的位置来定义图片的位置,入口文件和static是同一级目录-->
<img src="/static/ku.jpg" width="100px" height="100px">
<p class="error"><?php echo(strip_tags($msg));?></p>
<?php break;?>
<?php } ?>
2.修改配置文件,修改为自己写的界面,我们在thinkphp\tpl目录下新建两个文件,一个success.tpl和一个error.tpl文件,修改config.php下面的配置代码
//原来指定的路径
// 默认跳转页面对应的模板文件
'dispatch_success_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',
'dispatch_error_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl'
//修改为自定义的文件路径
'dispatch_success_tmpl' => THINK_PATH . 'tpl' . DS . 'success.tpl',
'dispatch_error_tmpl' => THINK_PATH . 'tpl' . DS . 'error.tpl'
重定向
\think\Controller
类的redirect
方法可以实现页面的重定向功能。
redirect方法的参数用法和Url::build
方法的用法一致(参考URL生成部分),例如:
//重定向到News模块的Category操作
$this->redirect('News/category', ['cate_id' => 2]);
上面的用法是跳转到News模块的category操作,重定向后会改变当前的URL地址。
或者直接重定向到一个指定的外部URL地址,例如:
//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);
可以在重定向的时候通过session闪存数据传值,例如
$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
使用redirect助手函数还可以实现更多的功能,例如可以记住当前的URL后跳转
redirect('News/category')->remember();
需要跳转到上次记住的URL的时候使用:
redirect()->restore();
ThinkPHP redirect 方法:
ThinkPHP redirect 方法可以实现页面的重定向(跳转)功能。redirect 方法语法如下:
$this->redirect(string url, array params, int delay, string msg)
一些常用的 redirect 重定向例子:
// 不延时,直接重定向
$this->redirect('select', array('status'=>1));
// 延时跳转,但不带参数,输出默认提示
$this->redirect('select', '', 3);
// 重定向到其他模块操作
$this->redirect('Public/login');
// 重定向到其他分组
$this->redirect('Admin-Public/login');
提示:
当延时跳转时,必须输入 params 参数(可以为空),也就是 delay 必须出现在第 3 位上。
如果发现跳转后的 URL 有问题,由于 redirect 方法调用 U 方法来生成跳转后的地址,这时候可以测试一下 U 方法生成的地址是否正确,再检查一下系统配置。