在PHP中如何从一个页面重定向到另外一个页面呢?

方法1:header() 跳转

header — 发送原生 HTTP 头,header() 用于发送原生的 HTTP 头。关于 HTTP 头的更多信息请参考 » HTTP/1.1 specification

请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过includerequire,或者其访问其他文件里面的函数的时候,如果在header()被调用之前,其中有空格或者空行,便会报错。同样的问题也存在于单独的 PHP/HTML 文件中。

PHP header() 官网文档:https://www.php.net/manual/zh/function.header.php

格式:

header ( string $string [, bool $replace = true [, int $http_response_code ]] ) : void

PHP里的header()函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,

例如,声明返回信息的类型("Context-type: xxx/xxx")、页面的属性("No cache", "Expire")等等。 

用HTTP头信息重定向到另外一个页面的方法如下:

<?php
// header("Location: https://proxy.mimvp.com");		// success

$go_url = "https://proxy.mimvp.com";
header("Location: $go_url");

exit();		// exit 是个语法结构,如果没有 status 参数要传入,可以省略圆括号, 即 exit;
?>

说明:注意 "Localtion: "的写法,Location 紧跟着一个冒号,空格,目标网址。

上面两种写法都是这正确的,Location 是立即跳转。

header 跳转需要同时满足以下三个条件:

1、location和“:”号间不能有空格,“:”号与url之间有一个空格。

2、在用header前不能有任何的输出, 即没有echo, print, printf, var_dump等。

3、header后的PHP代码还会被执行,因此一般用 exit 或 exit() 退出。

补充:php exit 的多种写法,详见 php exit

<?php
// exit program normally
exit;
exit();
exit(0);

// exit with an error code
exit(1);
exit(0376); // octal
?>

 

方法2:meta 标签

用 HTML 的 meta 标记,即用 meta 的 refresh 标记

<html>
<head>
<!-- 	
	// success, 在当前页面停留5秒钟, 然后跳转到目标网址
	<meta http-equiv="refresh" content="5; url=https://proxy.mimvp.com">  
-->
	<meta http-equiv="refresh" content="5; <?php $url = 'https://proxy.mimvp.com'; echo $url; ?>">
</head>
<body>
	<h1>I love mimvp.com, waiting 5, 4, 3, 2, 1...</h1>
</body>
</html>

说明:以上两种 meta 方式(直接网址,赋值变量网址)都成功,在当前页面停留5秒钟, 然后跳转到目标网址

一般用于提示用户的场景,等待用户看完提示后,定时(停留5秒钟)跳转到了目标网址;若设置为0秒,则立即跳转

 

方法3:js 脚本

<?php
echo "<script>url='https://proxy.mimvp.com'; window.location.href=url</script>"; 

// $url="https://proxy.mimvp.com";
// echo "<script language='javascript' type='text/javascript'>";
// echo "window.location.href='$url'";
// echo "</script>"; 

exit();		// exit 是个语法结构,如果没有 status 参数要传入,可以省略圆括号, 即 exit;
?>

利用 script 实现,还有一个好处,就是可以在新窗口、新父窗口打开网页

<?php
// 新窗体(tab)打开 
echo "<script>url='https://proxy.mimvp.com'; window.open(url);</script>";		

// 父窗口(window)打开
echo "<script>url='https://proxy.mimvp.com'; window.open(url, '', '_self');</script>";
?>

 

window.location.href 和 window.open() 区别

一、性质不同

1、window.location:window.location是window对象的属性

2、window.open():window.open是window对象的方法

二、用途不同

1、window.location:window.location用来替换当前页,也就是重新定位当前页 。

2、window.open():window.open用来让链接页面在新窗口中打开。

三、打开网站不同

1、window.location:window.location只能在一个网站中打开本网站的网页。

2、window.open():window.open可以在一个网站上打开另外的一个网站的地址 。

 

用window.location和window.open做链接的区别:

"top.location.href"是最外层的页面跳转
"window.location.href"、"location.href"是本页面跳转
"parent.location.href"是上一层页面跳转.
location是window对象的属性,而所有的网页下的对象都是属于window作用域链中(这是顶级作用域),所以使用时是可以省略window。

而top是指向顶级窗口对象,parent是指向父级窗口对象。
window.location是window对象的属性,而window.open是window对象的方法
window.location是你对当前浏览器窗口的URL地址对象的参考!

window.open是用来打开一个新窗口的函数!
window.open()是可以在一个网站上打开另外的一个网站的地址
而window.location()是只能在一个网站中打开本网站的网页

window.location或window.open如何指定target?
这是一个经常遇到的问题,特别是在用frame框架的时候

解决办法:
window.location 改为 top.location 即可在顶部链接到指定页

window.open("你的网址","_top");

<input type="button" value="新窗口打开" onclick="window.open('https://blog.mimvp.com')">
<input type="button" value="当前页打开" onclick="top.location='https://blog.mimvp.com','_top'">

 

 

PHP header() 函数

header() 函数向客户端发送原始的 HTTP 报头。

认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题):

<html>
<?php
// 结果出错, 在调用 header() 之前已存在输出
// 请务必保证, 在调用 header() 之前没有任何输出, 即没有echo, print, printf, var_dump等
header('Location: http://www.mimvp.com');
?>

 

header() 语法

header(string, replace, http_response_code)

参数 描述
string 必需。规定要发送的报头字符串。
replace

可选。指示该报头是否替换之前的报头,或添加第二个报头。

默认是 true(替换)。false(允许相同类型的多个报头)。

http_response_code 可选。把 HTTP 响应代码强制为指定的值。(PHP 4 以及更高版本可用)

注释:从 PHP 4.4 之后,该函数防止一次发送多个报头,这是对头部注入攻击的保护措施。

 

header()函数的第一个参数 string 有两种特别的头:

第一种以“HTTP/”开头的 (case is not significant,不区分大小写),将会被用来计算出将要发送的HTTP状态码。

例如,在 Apache 服务器上用 PHP 脚本来处理不存在文件的请求(使用 ErrorDocument 指令), 就会希望脚本响应了正确的状态码。

示例1:

<?php
header("HTTP/1.0 404 Not Found");
?>

第二种特殊情况是“Location:”的头信息。

它不仅把报文发送给浏览器,而且还将返回给浏览器一个 REDIRECT(302)的状态码,除非状态码已经事先被设置为了201或者3xx

<?php
header("Location: http://www.mimvp.com/"); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit;
?>

 

replace

可选参数 replace 表明是否用后面的头替换前面相同类型的头。 默认情况下会替换。如果传入 FALSE,就可以强制使相同的头信息并存。例如:

<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>

 

http_response_code

强制指定HTTP响应的值。注意,这个参数只有在报文字符串(string)不为空的情况下才有效。

 

示例2:

<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
?>
<html>
<body>
...
...

注释:用户可能会设置一些选项来更改浏览器的默认缓存设置。

通过发送上面的报头,您可以覆盖任何这些设置,强制浏览器不进行缓存!

 

示例3:

提示用户保存一个生成的 PDF 文件(Content-Disposition 报头用于提供一个推荐的文件名,并强制浏览器显示保存对话框):

<?php
header("Content-type:application/pdf");

// 文件将被称为 downloaded.pdf
header("Content-Disposition:attachment;filename='downloaded.pdf'");

// PDF 源在 original.pdf 中
readfile("original.pdf");
?>
<html>
<body>
...
...

注释:微软 IE 5.5 存在一个阻止以上机制的 bug,通过升级为 Service Pack 2 或更高的版本,可以解决该 bug。

 

 

参考推荐

PHP “headers already sent by” 错误的解决方法

PHP 出现 Notice: Undefined index: 的几种解决方法

PHP 数组提示 Notice: Undefined offset 解决办法

PHP 常见错误处理

PHP在 linux上执行外部命令

PHP 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息

PHP + Selenium + WebDriver 抓取米扑科技首页

PHP 文件操作常用函数

PHP 常用函数总结(数组,字符串,时间,文件操作)

PHP 路径详解 dirname,realpath,__FILE__,getcwd

PHP 下载保存文件到本地

PHP下载远程图片

PHP抓取网站ico图标

PHP Session与Cookie详解

PHP中的Session和Cookie应用

PHP 记住密码自动登陆

PHP 使用cookie实现记住登录状态

PHP 模拟POST提交2种方法

PHP 文件导入 require, require_once, include, include_once 区别