HTTP协议
来源:互联网 发布:软件报价怎么描述 编辑:程序博客网 时间:2024/06/05 12:43
URL构成
语法:protocol://host[:port]/directory/filename?name=value#anchor
参数: protocol
:协议。如:http://
、ftp://
、news://
、mail:
host
:主机名。如:127.0.0.1或www.baidu.com
[:port]
:端口号。如:80 directory
:目录名。 filename
:文件名。 ?name=value&name=value
,地址栏传参数。 #anchor
:锚点名称。
举例:http://www.2016.cn/images/img02.html?name=mary&pass=123456#top
请求
HTTP请求由三个部分构成:请求行、请求头信息、请求的主体
请求行格式
格式:请求方法 请求资源的URI HTTP协议版本号
参数:
请求方法,主要有两个GET和POST。请求方法必须大写。
请求资源的URI地址:请求资源的文件地址。 URL
(统一资源定位符):http://www.2016.cn/abc/yao.html URI
(统一资源标识符):/abc/yao.html HTTP
协议版本号:最新版本HTTP/1.1 GET /yao.php Http/1.1
请求头含义
请求主体
GET方式没有请求的主体,只有POST方式才有主体数据。
带有附件的http请求头
form表单要有enctype="multipart/form-data"
否则上传不了附件
简易防盗链
1、Refrerer的概述
Refrerer是一个请求的头信息,记录了当前用户,是从哪个页面链接过来的。
提示:必须单击链接跳到资源页面,如果不是单击链接,refrerer没有值。
2、为什么并不是每一次HTTP请求都有Refrerer呢?
必须通过链接才会存在。
直接在地址栏输入网址,浏览器不会发送Referer
从收藏夹打开网址,浏览器不会发送Referer
从HTTPS的网站跳转到HTTP的网站时,浏览器是不会发送Referrer的。
3、使用$_SERVER[]
获取HTTP请求信息 echo “<pre>”; print_r($_SERVER); echo “</pre>”;
4、实现网页防盗链
if(isset($_SERVER[‘HTTP_REFERER’])) { //判断是否含有本网站的域名 if(strops($_SERVER[‘HTTP_REFERER’],”http://www.abc.com”)===0) { echo “你可以下载电影了!”; //跳转到真正的下载数据的页面} else { echo “非法盗链者!”;} else {echo “非法操作!”;}
响应
1、HTTP响应的构成
语法:状态行 响应头部 响应体
2、状态行的格式
语法:协议版本 状态码 状态文本描述
3、状态码的含义
状态码是由三位数字构成,第一位数字定义了响应的类型。
4、常见的状态码
302状态码,它是网页版的重定向。
301状态码,是Apache服务器的跳转。常用于购买新域名,指向了原来的空间;而原来的旧域名,不想再使用,旧域名的访问一律都可以转到新域名。它还没有到达PHP环节就已经实现了跳转。
响应报头含义
//响应状态行HTTP/1.1 200 OK //请求的时间Date: Mon, 30 May 2016 08:04:07 GMT//告诉客户端服务器的相关信息Server: Apache/2.2.22 (Win32) PHP/5.3.13X-Powered-By: PHP/5.3.13//内容的长度Content-Length: 25//连接保持多长时间后断后Keep-Alive: timeout=5, max=100//连接类型:保持连接Connection: Keep-Alive//返回客户端文件类型Content-Type: text/html响应头域Refreshheader(“refresh:5;url=nofound.html”);
使用header()禁用缓存
Expires
:设置网页缓存的过期时间,格式是GMT。 Cache-Control:HTTP/1.1
提供的。
Pragma:兼容HTTP/1.0。不同浏览器支持不同的选项。为了所有浏览器都能生效,这两个选项都使用。
禁用浏览器缓存
缓存
header(‘Expires:’. gmt格式时间);
// 获取30秒后的gmt格式时间 $gmt = gmstrftime("%b %d %Y %H:%M:%S", time()+30).' GMT';
header('Expires:'.$gmt);
下载文件的HTTP响应头
1、Cotent-Type:application/octet-stream
描述:设置响应头为八进制的数据流。header(“Content-Type:application/octet-stream”);
2、Accept-Ranges:bytes
描述:如果在下载过程中,突然断开,网络恢复后,该如何下载?最好的方法是断点续传。曾经下过的数据不用再下载了。如果没有没有该头信息,网络恢复后,全部数据再下一遍。
提示:服务器首先要配置断点续传的功能。 header(“Accept-Ranges:bytes”);
3、Accept-Length:filesize
描述:告诉客户端文件的大小。如果客户端数据下载完成,要进行数据大小的比对。 header(“Accept-Length:filesize”);
4、Content-Disposition:attachment;filename=文件名
header(“Content-Disposition:attachment;filename=文件名”);
文件下载
<!doctype html><html lang="zh-cn"><head> <meta charset="UTF-8"> <title>展示出所有文件</title> <style> *{padding: 0; margin: 0; font-size: 18px; font-family: 楷体;} .con{ margin: 20px 0 0 20px; } b{ display: inline-block; width: 40px; } .dir i{ display: inline-block; width: 19px; height: 19px; background: url('./dir.png') no-repeat; background-size: 19px; position: relative; top: 4px; cursor: pointer; } .file i{ display: inline-block; width: 19px; height: 19px; background: url('./file.png') no-repeat; background-size: 19px; position: relative; top: 4px; } .box{display: none;} </style> <script src='jquery.js'></script> <script> $(function(){ $('.dir i').click(function(){ $(this).parent('.dir').next('.box').toggle(); }); }); </script></head><body> <div class="con"> <?php function showAll($dir, $b=''){ // 打开句柄 $handle = opendir($dir); // 过滤.和.. readdir($handle);//打开一个目录,读取它的内容,然后关闭 readdir($handle); while(($fileName = readdir($handle))||($fileName!==false)){ if($fileName == '.htaccess') continue; // 拼接完整路径 $newFile = "$dir/$fileName"; // 转码 $fileName = iconv('gbk', 'utf-8', $fileName); if(is_dir($newFile)){ echo "<div class='dir'>$b<i></i>$fileName</div>"; echo "<div class='box'>"; showAll($newFile, $b.'<b></b>'); echo '</div>'; }else{ // 编码,将中文转为%跟两位十六进制的数据类型 $newFile = urlencode($newFile); echo "<div class='file'>$b<i></i><a href='./doDownload.php?f=$newFile'>$fileName</a></div>"; } } // 关闭 closedir($handle); } showAll('./files'); ?> </div></body></html>
<?php//doDownload.php header('Content-type:text/html;charset=utf-8'); // echo $_GET['f']; doDownload(urldecode($_GET['f'])); /** * 下载一个文件 * @param string $fileName 要下载文件的地址 * @return void */ function doDownload($fileName){ // 禁止缓存 header('Expires:-1'); header('Cache-Control:no-cache'); header('Pragma:no-cache'); // 1、设置响应头为八进制数据流 header('Content-type:application/octet-stream'); // 2、告诉浏览器传送数据编码方式为2进制 header('Content-Transfer-Encoding: binary'); //3、支持断点续传 需要服务器支持断点续传功能 header('Accept-Ranges:bytes'); // 4、告诉客户端文件大小 $fileSize = filesize($fileName); header("Accept-Length:$fileSize"); // 5、告诉浏览器文件下载方式,以及下载的文件名 // 取出文件名中的空格 $tmpName = str_replace(' ', '-', $fileName); $tmpName = str_replace(' ', '-', $tmpName); $tmpName = explode('/', $tmpName); $tmpName = array_pop($tmpName); header("Content-Disposition:attachment;filename=$tmpName"); // 清空前面的输出 ob_end_clean(); //6、输出文件流 $handle = fopen($fileName, 'rb'); while($con = fread($handle, 1024)){ echo $con; } fclose($handle); }
- HTTP协议
- http协议
- HTTP协议
- HTTP协议
- HTTP协议
- http协议
- HTTP协议
- HTTP协议
- HTTP协议。。。
- HTTP协议
- HTTP协议
- HTTP协议
- HTTP协议
- HTTP协议
- http协议
- HTTP协议
- http协议
- HTTP协议
- Android 相关七种 CPU 架构适配
- Java 中extends与implements使用方法
- OpenWRT基础
- 某企业广域网BGP拓扑图
- 7065233排队
- HTTP协议
- BZOJ 1444: [Jsoi2009]有趣的游戏 AC自动机加矩阵快速幂
- 解决python2.x 的UnicodeDecodeError
- 转:程序员该如何定位?四个方向指引
- 使用nginx反向代理后如何在后台web应用中获取用户ip
- opencv3学习笔记(二)图像的截图,旋转与大小的变化
- java中讲讲ObjectOutputStream的用法,举例?
- 切蛋糕问题
- 并行操作测试