首页 > 代码库 > P?H?P?中?h?t?t?p?协?议?详?解
P?H?P?中?h?t?t?p?协?议?详?解
对PHP文件来说
Php可以有 html css javascript php脚本 flash它的不同部分是在不同的地方执行的(服务器和客户端)
http协议
1. http协议是建立在 tcp/ip协议基础上
2. 我们的web开发数据的传输都是依赖于http协议
3. http协议全称是超文本传输协议
http协议的 http请求
基本结构:
请求行
消息头
消息体(实体内容)
Accept text/html,application/xhtml+xml,application/xml;
q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Cache-Control max-age=0
Connection keep-alive
Host localhost
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
GET /http2.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost/test.php
Connection: keep-alive
说明:
GET override.php表示用get方式请求资源
Accept 表示客户端可以接收任何数据
Accept-Language 页面语言
Accept-Encoding 表示接收什么样的数据压缩格式
Host 主机
User-Agent 告诉我们服务器内核,操作系统
Connection 表示链接方式 不要立即断掉我们的请求
Referrer 表示我是从哪里来 防盗链
如果我这个http2.php , 不希望192.168.0.3的访问
在服务器端,我们可以通过一个$_SERVER 来获取我们需要的信息
重要的有:
HTTP_HOST=localhost
REMOTE_ADDR=127.0.0.1 访问该页面的IP
DOCUMENT_ROOT=G:/zhentuan 可以获取apache的主目录
REQUEST_URI=/http2.php 可以获取请求的资源名
http请求有两种主要的方式:
get/post 区别与联系
1. 安全性 get请求的数据会显示在地址栏上,post请求的数据放在http协议消息体内
2. 从可以提交的数据的大小来看:
http协议本身并没有限制数据大小
浏览器在对get和post请求做显示, get请求数据2k+35 post请求没有限制
3. Get请求可以更好的添加到收藏夹
现在我们实际使用一些http请求,完成一个防盗链的练习
?
if(isset($_SERVER[‘HTTP_REFERER‘])){
//取出来
//判断$_SERVER[‘HTTP_REFERER‘] 是不是以http://localhost开头的
if(strpos($_SERVER[‘HTTP_REFERER‘],"http://localhost/...")==0){
echo "你可以查看信息";
}else
{
//跳转到警告页面
header("Loaction:warning.php");
}
}else
{
//跳转到警告页面
header("Location:warning.php");
}
http协议的 http响应
Location:http://www.baidu.org/index.php
HTTP/1.1 200 OK 200 OK表示客户端请求成功
Server:Microsoft-IIs/5.0 表示告诉浏览器 服务器情况
Date:Thu,13 Jul 2000 05:46:53 GMT 告诉浏览器 请求页面的时间
Content-Length 2291 表示回来的数据有2291字节
Content-Type:text/html 文档类型
Cache-control:private 缓存
对状态码的说明
举例说明http响应在实际应用
u 302状态码的使用
比如我们现在希望,当访问a.php页面,让其自动重定向到b页面
基本用法:
<?php
//这句话会向客户端发送一个302的状态码,告诉浏览器重新访问b.php
//header可以向http头写入信息header — Send a raw HTTP header
header("Location:b.php");
?>
细节:302状态码也可以让其跳转到外网我去
u 404状态码的使用
一般就是该页面不存在
u 304状态码的使用
演示如何通过http响应,控制浏览器间隔一定时间去跳转
<?php
Header(“Refresh:3;url=http://www.sohu.com”);
?>
演示如何通过http响应控制页面缓存,默认情况下浏览器会缓存页面
//通过header来禁用缓存(ajax)
header("Expires:-1");
header("Cache-control:no-cache");
header("Pragma:no-cache");
echo "hellow cache";
http文件下载
文件下载的原理
//对函数的说明
//1.参数说明$file_name文件名
//2. $file_sub_dir:下载文件的子路径 ‘./xxx/xxx/‘
function down_file($file_name,$file_sub_dir){
//死去活来,演示下载一个图片
//如果文件是中文,必须对文件名进行转码
//原因,php文件函数,比较古老,需要对中文转码GB2312
$file_name=iconv("utf-8","gb2312",$file_name);
//1.使用相对路径
$file_path=$file_sub_dir.$file_name;
//2.使用绝对路径
//$file_path=$_SERVER[‘DOCUMENT_ROOT‘]."/down/".$file_name;
//打开文件
if(!file_exists($file_path))
{
echo "文件不存在";
return;
}
$fp=fopen($file_path,"r");
//猎取下载文件大小
$file_size=filesize($file_path);
//返回的文件
header("Content-type:application/octet-stream");
//按照字节大小返回
header("Accept-Ranges:bytes");
//返回文件大小
header("Accept-Length:$file_size");
//这里客户端的弹出圣诞框,对应的文件名
header("Content-Disposition:attachment;filename=".$file_name);
//向客户端回送数据
$buffer=1024;
//为了下载的安全,我们最好做一个文件字节读取计数器
$file_count=0;
//这句话用于判断文件是否结束
while(!feof($fp)&& ($file_size-$file_count>0)){
$file_data=http://www.mamicode.com/fread($fp,$buffer);
//统计读了多少个字节
$file_count+=$buffer;
//把部分数据回送给浏览器
echo $file_data;
}
// 关闭文件
fclose($fp);
}