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);    }
0 0