其实这个问题一直比较模糊。今天有人讨论这个东西,比较浅显的比较了一番。
我是从http这个角度来看的。
我用来测试的PHP代码
<?php $key = empty($_GET['key'])?0:$_GET['key']; echo $key; if($key == 'redirect'){ header("location:demo_1.php"); }else{ include('demo_1.php');
//print_r(file_get_contents('demo_1.php'));这也是可以的 } ?>
我们的需求是通过redirect.php 访问demo_1.php的内容
重定向:重定向是加入客户端发送请求A页面,A页面返回请求内容 头信息中 Status Code:302 Found 这个状态码告诉浏览器,页面发生了重定向,需再次像目标路径发起请求location:demo_1.php,然后第二次发起请求,服务器返回结果。以下是测试的头部信息
Request URL:http://www.stu.com/redirect.php?key=redirect Request Method:GET Status Code:302 Found Request Headersview source Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip,deflate,sdch Accept-Language:zh-CN,zh;q=0.8 Connection:keep-alive Host:www.stu.com User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 Query String Parametersview sourceview URL encoded key:redirect Response Headersview source Connection:Keep-Alive Content-Length:8 Content-Type:text/html Date:Wed, 13 Aug 2014 06:22:44 GMT Keep-Alive:timeout=5, max=100 location:demo_1.php Server:Apache/2.4.4 (Win64) PHP/5.4.12 X-Powered-By:PHP/5.4.12
以上是重定向流程。
转发:转发我在PHP 中是用的
include('demo_1.php');
print_r(file_get_contents('demo_1.php')
这俩个方法的源码我没了解,这个从http角度来说只发送了一次请求到redirect.php 然后在redirect.php 在引入了demo_1.php 这个文件(include('demo_1.php')) 二另外一种获取了demo_1.php的内容再输出来了。所以这俩者都没发送http请求。
区别二:
重定向路径会发生变化,转发不会。
区别三:
带的参数,重定向后失效,转发不会。