上面说的都是2字头和4字头的状态码,但是比较关键的是3字头的状态码---301、302。

先写一个PHP,PHP的内容是指定使用301的方式,重定向到百度,然后在浏览器的地址栏上输入这个PHP的文件地址之后,就会蹦出百度的界面,查看其状态就是301,如图:

wKioL1ba2iSzPafXAAJAr6iIEks473.png

301的意思是“永久性重定向别的URL”,302的意思是“临时性的重定向”。使用302的方法的话,重复上面的实验,会看到状态码是302,而且回复头信息会多一个location: www.baidu.com,就是代表重定向的目的地是百度这个网址。

这里说的“永久重定向”和“临时重定向”并不是那种时间上的“永久和临时”,不是说采用了临时重定向,再关机或者重启之后,重定向的功能就消失了。比如使用搜索引擎搜索“网易”,需要在地址栏输入www.163.net,那么以后即使www.163.net的地址改变了,输入www.163.com服务器会自动链接到新地址www.wangyi.com,那么这时候使用301的话,就等于直接登陆www.wangyi.com,彻底忘记www.163.net的存在。如果是302的话,会先www.163.net,然后www.163.net的服务器返回信息给客户机,你真实需要去的是www.wangyi.com,然后客户机再去跟www.wangyi.com产生链接。

一般来说,最好使用301,这样更安全,而且省下了一步中间信息返回的步骤。

比如说有一个页面,是注册用户页面,需要输入账号、密码、手机号、电子邮箱和验证码这五个信息。在用户输入完以上的信息之后,页面会有一个跳转,提示“注册成功”或者“注册失败”,这个几秒钟的跳转也是重定向,如果成功了就会从这个短暂的界面重定向到正式登陆成功的界面,同时用户的数据就会被记录到后台的数据库里,保存到服务器里。

但是要知道,在PHP写法里使用301或者302的话,假设还是在上面的例子里,用户的信息在重定向的界面是没有被保存的,检查一下返回头信息会很轻松的发现,返回头信息开始的时候是POST,但是到了重定向的界面会变成GET。GET是获得,自然不会把信息存入数据库里,用户的信息录入等于白写。

举个例子:假设05.php是用户写注册信息的网页,用户填写完所有信息之后,系统重定向到06.php这个网页。如果这个重定向使用的是302 or 301,那么在06.php上,其实是没有任何的用户输入的信息的!如图:

wKioL1ba3GHzFjl9AAQLbk1gFZ8501.png

wKiom1ba3gGT7UPhAADZmfVz_6c364.png

302不用试了,把301抹去,默认就是302的方法,两个方法都是一样的效果,数据丢失。

这个时候怎么办?使用307,307就是在重定向中依旧保持原有的数据。

 在上面的图里把301改成307,一切问题迎刃而解。而且可以看到,在05.php就是POST,在06.php里依旧还是POST。

wKiom1ba3yzx018vAAFpN35O-9A872.png

转载自:http://blog.51cto.com/chenx1242/1747923