更新时间: 2016-09-23 09:09:32       分类: web开发


入门

  1. http协议是建立在TCP/IP协议基础上的一个应用层协议

所有有关数据传输的事情都与TCP/IP有关

  1. 所有的www文件都是基于http协议发送的

  2. http目前常用的为1.1版本(长连接)

  3. [举例]打开一个网页时要发送多少请求?

这里要注意:文本,图片,音频,css,js等都是分开请求加载的,因此打开一个页面将会发送多个http请求

HTTP报文

基本结构

  1. 请求行/状态行
  2. 消息头
  3. 一个空行
  4. 实体内容

举例

  1. 请求报文举例
GET /digitalhermit HTTP/1.1
Host: www.cnblogs.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
  1. 响应报文举例
HTTP/1.1 302 Moved Temporarily
Date: Tue, 14 Jun 2016 02:25:01 GMT
Content-Type: text/html
Content-Length: 215
Connection: Keep-Alive
Set-Cookie: BIDUPSID=556D954C0147F16DDC29344E227822E1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1465871101; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BD_LAST_QID=9445901950388369334; path=/; Max-Age=1
Location: https://www.baidu.com/
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
//主体内容省略

请求报文说明

响应报文说明

实例

一、304与缓存

假设我们现在访问页面a.html:

hello world<br />
<img src="test.png"/>

在浏览器中输入对应的地址进行访问,可以看到发送了两次请求,两次的回应都是200 OK,其中第一次取回了html文档内容, 第二次取回了test.png这个文件。取回这张图片之后,浏览器端将会给它设定一个Max-Age参数,只要你不再向服务器端发 出请求(如刷新),那么浏览器在打开这个页面时就不会再向服务器发出任何请求,而是直接读取本地缓存。

现在我们刷新界面,可以看到又发送了两次请求,两次的回应一个是200 OK,一个是304 Not modified。第一次仍然取回 html文档内容,浏览器解析到图片时,就查看缓存,发现该图片已经在缓存中了,就向服务器端发出请求,问我要不要更新这 个图片,服务器端接收请求后发现该文件并没有发生改动就返回304让浏览器直接读取缓存了。

二、浏览器定时跳转

代码:

<?php
  header("Refresh:3;url=http://www.baidu.com");
  //3秒后自动跳转到www.baidu.com
?>

三、缓存控制

默认情况下页面是一定会被缓存的,并且提供了一个缓存截止的期限(Max-Age),现在我们用http头禁用缓存。

<?php
  header("Expires:-1");
  header("Cache-control:no_cache");
  header("Pragma:no-cache");
?>

四、文件下载

设置http头:

<?php

//函数说明:参数--文件名,和子文件夹路径,格式为"/xxx/xxx/"
function file_download($file_name,$file_sub_path){

//说明:下面有关文件操作的函数因为比较古老所以不支持UTF-8的中文编码,因此如果是中文,必须通过iconv函数转换文件名的编码
$file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_path.$file_name;
//如果想用相对路径可以使用"./down/".$file_name;不过绝对路径的读取速度更快

if(!file_exists($file_path))
{
    echo "No such files <br/>";
    return;
}

$fp = fopen($file_path,'r');//以只读方式读取该文件,fp是文件指针,指向文件的第一个位置

$file_size = filesize($file_path);//计算文件大小

//设置http头

header("Content-type: application/octet-stream");//返回文件是二进制流
header("Accept-Length:bytes");//按字节返回
header("Accept-Length: $file_size");//文件总大小
header("Content-Disposition: attachment;filename=".$file_name);//控制浏览器对话框弹出的信息

$buffer = 1024;//设置缓冲区的大小为1024字节
$file_counter = 0;

while(!feof($fp)&&$file_counter<$file_size)//在文件指针指向文件末尾之前不停的取出数据
{
  $file_data = fread($fp,$buffer);//每次读取1024字节
  $file_counter+=$buffer;
  echo $file_data;//把文件发送给浏览器
}

fclose($fp);//关闭文件流
}

file_download("file.png",'/learnphp/FDownload/down/');
?>

PHP与HTTP

获取HTTP内容

使用超全局数组$_SEVER[]

一些常用的项:

  1. HTTP_HOST:主机地址

  2. REMOTE_ADDR:访问该页面的主机的IP地址

  3. DOCUMENT_ROOT:服务器根目录

  4. REQUEST_URI:获取请求的资源名

发送原始http响应头

使用header()函数

  1. header函数用于向客户端发送一个原始的http响应头(注意只有消息头,没有实体内容)

  2. 使用header()时,在该函数前不能有任何输出,否则将会出错

  3. header()可以用来覆盖当前的http响应消息头,常用Location等属性

GET和POST

这两种请求方法是最常用的两种请求方法,下面罗列他们的区别

  1. GET的信息直接显示在地址栏中 ,而POST的信息是放在报文的内容中的
  2. 一般浏览器会对GET数据进行大小的限制

防盗链技术

核心PHP代码

<?php
//说明:本脚本利用referer报文头来实现防盗链技术
  if(isset($_SERVER['HTTP_REFERER'])){
    if(strpos($_SERVER['HTTP_REFERER'],"http://localhost/learnphp/Referer")===0){
      echo "the secret base....<br />";
    }else {
      header("Location: warning.php");
    }
  }else{
    echo "empty referer";
    header("Location: warning.php");
  }
 ?>

评论

还没有评论