301重定向循环研究

 

今天要公布的重要研究报告就是关于上图,也就是重定向循环。重定向也就是在服务器请求页面时,服务器HTTP在报文头部写入新的Location使页面跳转的过程。

如果请求页面A,A重定向到页面B,而页面B又重定向到A就发生了一个重定向循环。幸运的是浏览器在发生重定向循环时不会一直在两个页面间无限跳转,而是在跳转一定次数后显示上图所示的画面。

但是跳转多少次后浏览器会出现上面的页面呢,本实验室经过仔细地尝试,发现各个浏览器在这个问题上的处理上有很大的不同。

我们决定使用三个非常小的脚本程序来测试这个问题。

脚本A

<?php
setcookie("in",3);
header("location: http://localhost/301laboratory/test_4.php");

if ($_COOKIE['first']==15)
header("location: http://www.baidu.com");
?>

用来记录浏览器到过脚本A,并重定向到脚本B
<?php
setcookie("in",4);
$new = $_COOKIE['first']+1;
setcookie("first",$new);
header("location: http://localhost/301laboratory/test_3.php");
?>
最后脚本C
用来方便显示现在的COOKIE
<?php
print_r($_COOKIE['first']);
echo"<br/>";
print_r($_COOKIE['in']);
setcookie("first",0);
setcookie("in",0);
?>



首先是CHROME浏览器上,我们运行脚本A,很遗憾,它没能跳到脚本B15次就显示出包含重定向循环,这时我们查看脚本C,发现显示如下:


说明CHROME跳转去脚本B 10次,在服务器第11次让浏览器跳转到脚本B时,CHROME判定这个页面包含重定向循环,不予以跳转,因为第二值为3,说明最后执行脚本为A。


然后我们开始测试IE,IE上运行脚本A,能够正确地跳转到百度,于是我们改大了判定跳转次数为100,IE不能正确跳转了,查看脚本C,结果为55,3,如下图:

即是IE跳转到B,55次后拒绝继续跳转,但是IE上我们发现了奇怪的特性,如下图:

就是当服务器每第5次让IE跳转到脚本B时,IE会怀疑服务器给的命令有误,拒绝跳转到脚本B,并重新刷新脚本A,当脚本A再次让它跳转到脚本B的时候它才会执行,当这种情况出现到第10次时,IE在拒绝跳转到脚本B的同时也不再刷新脚本A,显示此页面包含重定向循环。


接下来试验safari,在safari上运行脚本A,浏览器没有跳转去百度,显示:

于是去查看脚本C,惊奇地竟然显示为 ,看起来似乎浏览器完全没有跳转过。
改小判定跳转百度的次数为7,safari可以跳转至百度,再取查看脚本C,显示结果依然为0,0


于是我们猜想是否safari存在沙盒机制判定出包含重定向后,safari不会将COOKIE写入。

只好修改脚本,改用session。session在服务器端,应该不受safari影响,无奈测试结果仍然是0,0.

再次修改脚本,在脚本B中连接数据库,

修改脚本B为
<?php
$dbhost="localhost";
$dbuser="root";
$dbname="301library";
$dbpassword="root";
$conn=mysql_connect($dbhost,$dbuser,$dbpassword) or die("shibai");
mysql_select_db($dbname,$conn) or die("dberror");
mysql_query("SET NAMES 'UTF8'");
session_start();
$_SESSION['in']=4;
$_SESSION['first']++;
$sess=$_SESSION['first'];
$sql="UPDATE test set `value`=$sess where id = 1";
mysql_query($sql);

	header("location: http://localhost/301library/test_3.php");

?>
再次运行脚本A,终于在数据库中看见了结果,
8,3
也就是说safari判定重定向的次数是8次。


至于上面说的safari显示0,0的问题,本实验室还没结果,有兴趣的可以自己试试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值