在PHP中如何从一个页面重定向到另外一个页面呢?
方法1:header() 跳转
header — 发送原生 HTTP 头,header() 用于发送原生的 HTTP 头。关于 HTTP 头的更多信息请参考 » HTTP/1.1 specification。
请注意header()必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过include,require,或者其访问其他文件里面的函数的时候,如果在header()被调用之前,其中有空格或者空行,便会报错。同样的问题也存在于单独的 PHP/HTML 文件中。
格式:
header ( string $string [, bool $replace = true [, int $http_response_code ]] ) : void
PHP里的header()函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,
例如,声明返回信息的类型("Context-type: xxx/xxx")、页面的属性("No cache", "Expire")等等。
用HTTP头信息重定向到另外一个页面的方法如下:
// 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
// exit program normally
exit;
exit();
exit(0);
// exit with an error code
exit(1);
exit(0376); // octal
?>
方法2:meta 标签
用 HTML 的 meta 标记,即用 meta 的 refresh 标记
I love mimvp.com, waiting 5, 4, 3, 2, 1...
说明:以上两种 meta 方式(直接网址,赋值变量网址)都成功,在当前页面停留5秒钟, 然后跳转到目标网址
一般用于提示用户的场景,等待用户看完提示后,定时(停留5秒钟)跳转到了目标网址;若设置为0秒,则立即跳转。
方法3:js 脚本
echo "";
// $url="https://proxy.mimvp.com";
// echo "
// echo "window.location.href='$url'";
// echo "";
exit();// exit 是个语法结构,如果没有 status 参数要传入,可以省略圆括号, 即 exit;
?>
利用 script 实现,还有一个好处,就是可以在新窗口、新父窗口打开网页
// 新窗体(tab)打开
echo "";
// 父窗口(window)打开
echo "";
?>
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");
PHP header() 函数
header() 函数向客户端发送原始的 HTTP 报头。
认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题):
// 结果出错, 在调用 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:
header("HTTP/1.0 404 Not Found");
?>
第二种特殊情况是“Location:”的头信息。
它不仅把报文发送给浏览器,而且还将返回给浏览器一个 REDIRECT(302)的状态码,除非状态码已经事先被设置为了201或者3xx。
header("Location: http://www.mimvp.com/"); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit;
?>
replace
可选参数 replace 表明是否用后面的头替换前面相同类型的头。 默认情况下会替换。如果传入 FALSE,就可以强制使相同的头信息并存。例如:
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>
http_response_code
强制指定HTTP响应的值。注意,这个参数只有在报文字符串(string)不为空的情况下才有效。
示例2:
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
?>
...
...
注释:用户可能会设置一些选项来更改浏览器的默认缓存设置。
通过发送上面的报头,您可以覆盖任何这些设置,强制浏览器不进行缓存!
示例3:
提示用户保存一个生成的 PDF 文件(Content-Disposition 报头用于提供一个推荐的文件名,并强制浏览器显示保存对话框):
header("Content-type:application/pdf");
// 文件将被称为 downloaded.pdf
header("Content-Disposition:attachment;filename='downloaded.pdf'");
// PDF 源在 original.pdf 中
readfile("original.pdf");
?>
...
...
注释:微软 IE 5.5 存在一个阻止以上机制的 bug,通过升级为 Service Pack 2 或更高的版本,可以解决该 bug。
参考推荐: