PHP-http协议请求、防盗链

HyperText Transfer Protocol 超文本传输协议(文本、图片、视频等)
http 是建立在 TCP/IP协议的一个应用层协议

内容一样浏览器只发出1次http请求!

1
2
3
4
5
6
7
8
9
请求行:GET /js.php HTTP/1.1 【请求资源-协议版本】
消息头:
Host: www.test.com 【主机】
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0 【告诉服务器浏览器的内核、操作系统】
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 【客户端可以接受的文件类型】
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 【网页语言】
Accept-Encoding: gzip, deflate 【接收什么样的数据压缩格式】
Referer: http://www.test.com/ 【代表页面是从哪儿来的】
Connection: keep-alive 【表示不要立即断掉】
1
2
3
4
5
6
7
8
9
响应头信息
HTTP/1.1 200 OK 【200 OK 表示客户端请求成功】
Date: Fri, 09 Sep 2015 08:52:49 GMT 【告诉浏览器请求页面的时间】
Server: Apache/2.4.7 (Unix) PHP/5.5.9 OpenSSL/1.0.1f mod_perl/2.0.8-dev Perl/v5.16.3 【告诉浏览器服务的情况】
X-Powered-By: PHP/5.5.9
Content-Length: 1331 【表示或送的数据有多少字节】
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html 【文档类型】

Date:告诉浏览器,请求页面的时间!(用于判断页面相应时间,根据时间反应是否可以调用缓存信息)

一个空行:
消息体(实体内容)
xxx

$_SERVER 服务器和执行环境信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Array
(
[UNIQUE_ID] => V9J4YX8AAAEAAPozd4EAAAAC
[HTTP_HOST] => www.test.com
[HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_CONNECTION] => keep-alive
[PATH] => /usr/bin:/bin:/usr/sbin:/sbin
[DYLD_LIBRARY_PATH] => /Applications/XAMPP/xamppfiles/lib
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache/2.4.7 (Unix) PHP/5.5.9 OpenSSL/1.0.1f mod_perl/2.0.8-dev Perl/v5.16.3
[SERVER_NAME] => www.test.com
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => /Users/uiste/www/
[REQUEST_SCHEME] => http
[CONTEXT_PREFIX] =>
[CONTEXT_DOCUMENT_ROOT] => /Users/uiste/www/
[SERVER_ADMIN] => you@example.com
[SCRIPT_FILENAME] => /Users/uiste/www/test.php
[REMOTE_PORT] => 50802
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test.php
[PHP_SELF] => /test.php
[REQUEST_TIME_FLOAT] => 1473411169.446
[REQUEST_TIME] => 1473411169
)

【PATH】:服务器端的环境变量
$_SERVER[‘REMOTE_ADDR’] 获取本地的IP地址;
REQUEST_URI 获取请求的资源名

DOCUMENT_ROOT 站点根目录

Referer :防盗链

1
2
3
4
5
6
7
8
9
if (isset($_SERVER['HTTP_REFERER'])) {
if (strpos($_SERVER['SERVER_ADDR'],$_SERVER['HTTP_REFERER'])===0) {
echo '您是合法用户';
}else{
echo "您是非法用户";
}
}else{
echo "你这用户不合法";
}

注意字符串查找返回0,0与false的比较问题

http请求有两种主要的方式

get/post
相同:都是向服务器发送数据
区别:
1、安全性get请求的数据会显示在地址栏上,post请求的数据,放在http协议的消息体上
2、http协议本身并没有限制数据的大小,主要是浏览器限制get请求2k+35
对post请求没有限制
3、get提交的更利于添加到收藏夹

状态码

状态码-含义
100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200~299:表示成功接收请求并已完成整个处理过程,常用200
300~399:为完成请求,客户需进一步细化请求,例如,请求的资源已经移动到一个新地址,常用302,304
400~499:客户端的请求有错误,常用404
500~599:服务器端出现错误,常用500

302:页面重定向
404:该页面不存在
304:资源已存在

跳转header("refresh:3;url=http://www.uiste.com");

通过header禁用缓存(ajax)

header(“Expires:-1”);
header(“Cache-Control:noch”);
header(“Pragma:no-cache”);

文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php 
function downfile($filename){
$filename = 'xxx.jpg';
//中文转码
$filename = iconv('utf-8','gb2312',$filename);
//绝对路径
$filepath = $_SERVER['DOCUMENT_ROOT'].'down/'.$filename;
//打开文件
if (!file_exists($filepath)) {
echo '文件不存在';
return;
}
$fp=fopen($filename,'r');
//获取下载文件的大小
$filesize = filesize($filepath);
//返回的文件
header("Content-Type:application/octet-stream");
//按照字节大小返回
header("Accept-Ranges:bytes");
//返回文件大小
header("Accept-Length:$filesize");
//客户端弹出对话框,对应的文件名
header("Content-Disposition:attachment;filename=".$filename);
//先客户端回送数据
$buffer = 1024;
//读取文件
$filedata = fread($fp,$buffer);
//关闭文件
fclose($fp);
}
?>