重定向与history.go()、history.back()

重定向

301 永久重定向,告诉客户端以后应从新地址访问。
302 作为HTTP1.0的标准,以前叫做Moved Temporarily,现在叫Found,现在使用只是为了兼容性的处理,PHP的默认Location重定向用的也是302。
但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化
303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。

重定向测试

submit.html代码,发起post请求到 trans1.php

<form action='/history_go/trans1.php' method='post'>
    <input type="text" name="aaa">
    <input type="submit" >
</form>

<script>
    alert('js run');
</script>

trans1.php 页面重定向处理,跳到 trans2.php

header('Location: /history_go/trans2.php', TRUE, '307');

trans2.php 打印出post的结果

var_dump($_POST);die;

….
301 => “HTTP/1.1 301 Moved Permanently”,
302 => “HTTP/1.1 302 Found”,
303 => “HTTP/1.1 303 See Other”,
307 => “HTTP/1.1 307 Temporary Redirect”,
….

测试结果:
301、302和303的处理结果是一样的,直接跳转到 trans2.php,post没有内容
307的会将post数据请求到 trans2.php

重定向与history.go()

submit.html代码,发起post请求到 trans1.php

<form action='/history_go/trans1.php' method='post'>
    <input type="text" name="aaa">
    <input type="submit" >
</form>

<script>
    alert('js run');
</script>

trans1.php 页面重定向处理,跳到 trans2.php

header('Location: /history_go/trans2.php');

trans2.php 页面重定向处理,跳到 go.html

header('Location: /history_go/go.html');

go.html页面内容

<a href="javascript:history.go(-2);">javascript:history.go(-2);</a>
<br >
<a href="javascript:history.go(-1);">javascript:history.go(-1);</a>

trans1.php、trans2.php的referer都是:Referer:http://mytest.com/history_go/submit.html,在go.html页面go(-1)是submit.html(相当于点一次浏览器的后退)。并且后退到submit.html,js会运行(在一些后退后页面需刷新的可以用到)。

header Refresh

header("Refresh:3;url=/history_go/trans2.php");会在3秒后执行跳转,trans2.php页面 Status Code:200,trans2.php的referer是trans1.php,go(-1)退到trans1.php。
会在3秒后执行跳转,trans2.php页面 Status Code:200,trans2.php的referer是trans1.php,go(-1)退到trans1.php。

有趣现象:header refresh、meta标签跳转时,如果是0或1秒,trans2.php页面 Status Code:200,trans2.php的referer是trans1.php,chrome go(-1)退到submit.html,IE go(-1)退到trans1.php。 【 chrome 版本 58.0.3029.110 (64-bit) IE 8 64bit 】

其他方法

1、trans1.php内容:<script> window.location.href="/history_go/trans2.php"; </script><script> window.location.replace("/history_go/trans2.php"); </script>在chrome、IE的表现与上述现象类似,200,referer是trans2.php,但后退是submit.html(window.location.replace方法 (让新页面替换掉当前页面,不会保存在历史记录里,所有不能使用浏览器后退到原页面了))
2、使用js方法实现延迟跳转

//trans1.php
<script> 
setTimeout("window.location.href='/history_go/trans2.php'",3000); 
</script>

此时将setTimeout第二个参数改为1000(毫秒),甚至不填(0),go.html页面后退都可以推到trans1.php
这里写图片描述

history.go 与 history.back

submit.php

<?php echo mt_rand(1,1000); ?>

<br>
<form action='/history_go/go_back.html' method='get'>
    <input type="text" name="aaa">
    <input type="submit" >
</form>

<script>
    alert('js run');
</script>

go_back.html

<input type="button" name="" value="go" onclick="history.go(-1);">  
<input type="button" name="" value="back" onclick="history.back(-1);"> 

1、go back返回都会执行js,页面不刷新,表单数据都还在(页面php随机数不变,抓包无请求)
2、go可以退多步(后面加数字,如2 -2),back只能退一步,-2无效

参考

HTTP 的重定向301,302,303,307(转)
对于javascript中 history.go back的总结
PHP页面跳转三种实现方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值