PHP中http协议详解
对PHP文件来说
Php能够有 html css javascript php脚本 flash它的不同部分是在不同的地方运行的(server和client)
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 表示client能够接收不论什么数据
Accept-Language 页面语言
Accept-Encoding 表示接收什么样的数据压缩格式
Host 主机
User-Agent 告诉我们server内核,操作系统
Connection 表示链接方式 不要马上断掉我们的请求
Referrer 表示我是从哪里来 防盗链
假设我这个http2.php , 不希望192.168.0.3的訪问
在server端。我们能够通过一个$_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表示client请求成功
Server:Microsoft-IIs/5.0 表示告诉浏览器 server情况
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
//这句话会向client发送一个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");
//这里client的弹出圣诞框,相应的文件名称
header("Content-Disposition:attachment;filename=".$file_name);
//向client回送数据
$buffer=1024;
//为了下载的安全,我们最好做一个文件字节读取计数器
$file_count=0;
//这句话用于推断文件是否结束
while(!feof($fp)&& ($file_size-$file_count>0)){
$file_data=fread($fp,$buffer);
//统计读了多少个字节
$file_count+=$buffer;
//把部分数据回送给浏览器
echo $file_data;
}
// 关闭文件
fclose($fp);
}