PHP 实现页面跳转的几种方法
在PHP中如何从一个页面重定向到另外一个页面呢?
方法1:header() 跳转
header — 发送原生 HTTP 头,header() 用于发送原生的 HTTP 头。关于 HTTP 头的更多信息请参考 » HTTP/1.1 specification。
请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过include,require,或者其访问其他文件里面的函数的时候,如果在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 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息
PHP + Selenium + WebDriver 抓取米扑科技首页
PHP 路径详解 dirname,realpath,__FILE__,getcwd
PHP 文件导入 require, require_once, include, include_once 区别
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2020-02-22 05:39:29
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: PHP 实现页面跳转的几种方法 (米扑博客)