HTTP协议
超文本传输协议(HyperText Transfer Protocol)
1、http协议建立在 tcp/ip协议基础之上
2、我们的web开发数据的传输都是依赖于http协议
3、http协议全称 超文本传输协议
**短连接http1.0 (发送后立马断开连接) 长连接http1.1(超时断开连接)
httpwatch插件抓取http内容
图床技术(图片放在专门的服务器上)
实例
<h1>abc</h1>
<img src=”new.jpg”/>
<img src=”new1.jpg”/>
3次http请求:文字,new,new1。(都是不同的,图片相同时是2次,暂时存储相同的)
http协议的--http请求(Request)
基本结构:
请求行
消息头
消息体(实体内容)
举例:
GET /phpdemo/http/http1.php HTTP/1.1
【表示发送的是get请求,请求资源是/phpdemo/http/http1.php】
Accept: text/html, application/xhtml+xml, */* 【表示客户端可以接受任何数据类型】
Referer: http://localhost/phpdemo/http/ 【1、表示我是从哪里来的】
Accept-Language: zh-CN 【页面接受什么语言】
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
【告诉服务器我的浏览器的内核,操作系统】
Accept-Encoding: gzip, deflate 【接受什么样的数据压缩格式】
Host: localhost 【主机,默认80】
Connection: Keep-Alive 【表示不要立即断掉请求】
现在我想知道,客户端究竟给服务器端发送了什么东西
这个页面不想一个IP用户不能访问
在服务器端,我们可以通过$_SERVER来获取我们需要的信息
重要的有:
[HTTP_HOST]
[REMOTE_ADDR] 访问该页面的IP地址
[DOCUMENT_ROOT] 可以获取apache主目录
[REQUEST_URI] 可以获取请求资源名
http请求有两种主要的方式:
get/post
get和post的区别有哪些
1、安全性get请求的数据会显示在地址栏上,post请求的数据,放在http协议的消息体里面
2、从可以提交数据的大小来看
a) http协议本身并没有限制数据的大小
b) 浏览器在对get和post请求做限制,get请求数据2K+35 ,post请求没有限制
3、get请求可以更好的添加到收藏夹
现在实际使用以下http,完成一个防盗链的练习
☞ http请求布什固定的,是根据实际情况的,REFERER
strpos($str,””);
接受的数据
1、基本结构
状态行
消息头信息
<--空行
实体信息
快速入门
HTTP/1.1 200 OK 【200 OK表示客户端请求成功】
Date: Wed, 02 Jan 2013 07:50:06 GMT 【告诉浏览器 请求的页面时间】
Server: Apache/2.2.17 (Win32) PHP/5.3.3 【表示告诉浏览器 服务器的情况】
X-Powered-By: PHP/5.3.3
Content-Length: 30 【表示回送的数据有 30 个字节】
Keep-Alive: timeout=5, max=95
Connection: Keep-Alive
Content-Type: text/html;charset=utf-8 【文档类型】
Cache-control private 【缓存】
u 对状态码的说明
举例说明http响应的实际运用
u 302状态码的使用:
我们现在希望访问a.php 页面,让其自动重定向到b.php页面
基本用法使用
<?php
//会向客户端发送一个302 页面,要求浏览器重新访问b.php页面
//header可以向http里面写东西 header — Send a raw HTTP header
header("Location:新页面");
header(“Location:http://www.baidu.com”);
?>
细节:302状态码也可以让其跳转到外网去
u 404码
404 一般说就是该页面不存在
u 304码的使用
<?php
echo "helloo";
echo "<img src='new.jpg'/>";
?>
上面说明了304的具体使用方法
HTTP/1.1 304 Not Modified
Date: Wed, 02 Jan 2013 08:38:14 GMT
Server: Apache/2.2.17 (Win32) PHP/5.3.3
Connection: Keep-Alive
Keep-Alive: timeout=5, max=99
ETag: "3c00000002b733-1871-4af521bd79b23"
下面是比较详细的一个http响应
演示如何通过http响应,控制浏览器间隔一定时间去跳转
<?php
//表示 3 秒后自动跳转到百度的页面
header("Refresh:3;url=http://ww.baidu.com");
?>
演示如何通过http响应控制页面缓存,在默认情况下,浏览器回缓存页面
<?php
//通过header禁用缓存(ajax)
header("Expries:-1");
header("Cache-Control:no_cache");
header("Pragma:no_cache");
echo "hello cache";
?>
演示http实际应用 文件下载
中文时,文件名必须转码(utf-8==>gb2312),才能下载
文件下载的原理:
<?php
//函数说明
//参数说明$file_name 文件名
// $file_sub_dir 下载文件的子路径 ‘/xxxx/xxx/’
function down_file($file_name,$file_sub_dir){
//死去活来,演示下载一个图片
//如果文件是中文的
//原因:php文件系统比较早,需要对中文转码 gb2312
$file_name=iconv("utf-8", "gb2312", $file_name);
//文件不在同级时路径(相对)
//$file_path="./down/".$file_name;
//如果希望使用绝对路径
$file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
//1、打开文件
if (!file_exists($file_path)){
echo "文件不存在";
return ;
}
$fp=fopen($file_path,"r");
//获取下载文件的大小
$file_size=filesize($file_path);
if ($file_size>30){
echo "<script language='javascript'>window.alert('文件过大');</script>";
return ;
}
//返回文件
header("Content-type:application/octet-stream");
//按照字节大小返回
header("Accept-Ranges:bytes");
//返回文件大小
header("Accept-Length:$file_size");
//这里客户端的弹出对话框,对应的文件名
header("Content-Disposition:attachment;filename=".$file_path);
//向客户端回送数据
$buffer=1024;
//为了安全,我们最好做一个文件字节读取计数器
$file_count=0;
//这句话用于判断文件是否结束
while (!feof($fp) && ($file_size-$file_count)){
$file_data=fread($fp, $buffer);
//把部分数据会送给浏览器
echo $file_data;
}
//关闭文件
fclose($fp);
}
down_file("桌面.jpg", "/phpdemo/http/down/")
?>