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