HTTP协议

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.13
X-Powered-By: PHP/5.3.13
//内容的长度
Content-Length: 25
//连接保持多长时间后断后
Keep-Alive: timeout=5, max=100
//连接类型:保持连接
Connection: Keep-Alive
//返回客户端文件类型
Content-Type: text/html
响应头域Refresh
header(“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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值