李成笔记网

专注域名、站长SEO知识分享与实战技巧

http协议详解 http协议是什么

http协议 HyperText Transfer Protocol

超文本传送协议(HTTP)是一种通信协议, 它允许将超文本标记语言(HTML)文档从Web服务器传送到Web浏览器。

1.http协议是建立在tcp/ip协议基础上;

2.我们的web开发数据的传输都是依赖于http协议;

3.http协议全称是 超文本传输协议;


URL(统一资源定位符)

Uniform Resource Locator


统一资源定位符

http://www.xxxxxx.com:80/index.php

协议:http(信鸽)

主机:www.xxxxxx.com

端口号:80 所有浏览器默认请求都是80端口

资源:/index.php

HttpWatch软件(强大的网页数据分析工具)


Stream(流)

左边:客户端向服务器端发送数据流

右边:服务器端向客户端返回数据流

http协议的-http请求(request)细节(客户端向服务器端发送数据流)

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。

一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,

消息头和实体内容之间要用空行隔开。如下所示:

基本结构

请求行

消息头

<----空行

消息体(实体内容)

举例:

GET /test/hello.html HTTP/1.1

【表示发送的get请求, 请求资源是/test/hello.html 】

Accept: */* 【表示客户端可以接受任何数据】

Referer: http://localhost:80/test/abc.html 【1.表示我是从哪里来】

Accept-Language: zh-cn 【页面语言】

User-Agent: Mozilla/4.0 【告诉服务我的浏览器的内核,操作系统】

Accept-Encoding: gzip, deflate 【表示接受什么样的数据压缩格式.】

Host: localhost:80 【主机:80】

Connection: Keep-Alive 【表示不要立即断掉我们的请求.】

现在我们想知道,客户端究竟给服务器发送的内容

如果我这个http1.php. 不希望 192.168.1.33 这个用户访问.

在服务器端,我们可以通过$_SERVER来获取我们需要的信息

重要的有:

HTTP_HOST 当前请求头中Host

REMOTE_ADDR 访问该页面的ip

DOCUMENT_ROOT 可以获取 apche的主目录

REQUEST_URI 可以获取 请求的资源名

http请求有两种主要的方式

get / post

GET提交,请求的数据会跟在URL之后例如:login.php?name=abc&password=kkk

POST提交:把提交的数据放置在是HTTP包的包体中。比如:

POST /test/reg.php HTTP/1.1

Host:

Content-Type:

Content-Length:

<--空行

name=abc&password=xyz


get和post的区别有哪些

1. GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

2. 安全性:get请求的数据会显示在地址栏上, post请求的数据,放在http协议的消息体,post安全性高

3. 从可以提交数据的大小看:http协议本身并没有限制数据大小。GET:特定浏览器和服务器对URL长度有限制,

例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

因此对于get提交时,传输数据就会受到URL长度的限制。post:由于不是通过URL传值,理论上数据不受限。

4. get请求可以更好的添加到收藏夹;


用于HTTP请求中的常用头

Accept: text/html,image/*

Accept-Charset: ISO-8859-1

Accept-Encoding: gzip,compress

Accept-Language: en-us,zh-cn

Host: www.sohu.com:80

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT

Referer: http://www.sohu.com/index.php

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)

Cookie

Connection: close/Keep-Alive

Date: Tue, 11 Jul 2003 18:23:51 GMT

当服务器需要知道请求是来自哪个ip等信息,就可通过程序获得相应的信息。

防止盗链的关键程序:

'HTTP_REFERER' 引导用户代理到当前页的前一页的地址(如果存在)。

由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。

<?php
if(isset($_SERVER['HTTP_REFERER'])){ //判断是否是空值
//取出来
//判断$_SERVER['HTTP_REFERER']是不是以本网站网址开头的
if(strpos($_SERVER['HTTP_REFERER'],"网站域名")==0){
echo "你没有盗链";
//语句....
}else
//跳转到警告页面
header("Location:warning.php");
}else{
header("Location:warning.php");
}
?>

http响应(response)服务器端向客户端返回数据流(以下的内容都是基于服务器端向客户端发送的信息)

简单定义: 一个Http响应代表服务器给浏览器回送的数据,同时告诉浏览器应当怎样处理数据;(表示服务器响应客户端浏览器的信息)

1. 基本结构

状态行

消息头信息

<--空行

实体信息

快速入门

HTTP/1.1 200 OK 【200 ok 表示客户端请求成功】

Server: Microsoft-IIS/5.0 【表示告诉浏览器 服务器的情况 】

Date: Thu, 13 Jul 2000 05:46:53 GMT 【告诉浏览器请求的页面的时间 】

Content-Length: 2291 【表示回送的数据有2291个字节】

Content-Type: text/html 【文档类型】

Cache-control: private 【缓存】

<--空行

hello 实体细节


HTTP响应的细节--状态行

格式:HTTP版本号 状态码 原因叙述<CRLF>

单例:HTTP/1.1 200 OK

状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数,响应状态码分为5类

状态码 含义

100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程

200~299 表示成功接收请求并已完成整个处理过程,常用200

300~399 为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302、304

400~499 客户端的请求有错误,常用404

500~599 服务器端出现错误,常用 500

举例说明Http响应的实际应用:

302状态码使用:

比如我们现在希望访问a.php 页面,让其自动重定向到b.php

基本用法使用

<?php
/*header("Location: 新的页面");这句话会向客户端发送一个302状态码;(发送的是两个请求状态码,首先发送302状态码,告诉浏览器重新访问新的页面,
然后服务器再发送200状态码)/*
header("Location: http://www.sohu.com");
exit();

?>

细节: 302 状态码也可以让其跳转到外网去

404状态码使用:

404 最常见的状态码 404一般说就是该页面不存在

304状态码使用:

304 码主要是告诉浏览器,请求的资源不需要更新(理解:因为文件已经缓存了,就不需要更新)

<?php
echo "hello";
echo "<img src="Sunset.jpg" width="100px">"
?>

以上代码访问了一次,再重新打开时,则服务器向客户端浏览器发送304状态码,告诉浏览器,请求的图片不需要更新

上面说明了304的具体用法

HTTP/1.1 304 Not Modified

Date: Tue, 13 Sep 2011 02:10:38 GMT

Server: Apache/2.2.17 (Win32) PHP/5.3.5

Connection: Keep-Alive

Keep-Alive: timeout=5, max=99

ETag: "12d00000000572c-6f69-3e1d849f35000"

下面是比较详细的一个Http响应

Location: http://www.baidu.org/index.php

Server:apache

Content-Encoding: gzip 【内容编码支持gzip压缩算法】

Content-Length: 80 【返回数据大小】

Content-Language: zh-cn

Content-Type: text/html; charset=GB2312

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 【表示浏览器请求资源,最新时间】

Refresh: 1;url=http://www.baidu.com 【告诉浏览器,间隔1秒,重定向到 baidu】

Content-Disposition: attachment; filename=aaa.zip

Transfer-Encoding: chunked

Set-Cookie:SS=Q0=5Lb_nQ; path=/search 【讲Cookie】

Expires: -1

Cache-Control: no-cache

Pragma: no-cache

Connection: close/Keep-Alive

Date: Tue, 11 Jul 2000 18:23:51 GMT

演示如何通过Http响应,控制浏览器间隔一定时间去跳转.

<?php
//header("Refresh: 3 ; url=http://www.sohu.com");
header("Refresh: 3 ; url=http://localhost/http/d.php");
?>

演示如何通过Http响应控制页面缓存,在默认情况下,浏览器会缓存页面.

<?php
//通过header来禁用缓存(ajax )
header("Expires: -1");
header("Cache-Control: no_cache");
header("Pragma: no-cache");
echo "hello!cache";
?>

//下载文件需要的头

header("Content-type: application/octet-stream"); //告诉浏览器返回的是文件(即输出MIME类型)

header("Accept-Ranges: bytes"); //告诉浏览器按照字节大小返回,可以不要此行语句,最好保留

header("Accept-Length: $file_size"); //文件大小

header("Content-Disposition: attachment; filename=".$file_name); //这里是客户端弹出的对话框,对应的文件名

演示Http实际应用的 文件下载

代码如下:

<?php
    //函数的使用说明
    //参数说明 $filename 文件名称
    // $file_sub_dir: 下载文件的子路径 "/xxx/xxx/"
    function down_file($filename,$file_sub_dir){
    //演示下载图片.
    //如果文件是中文.


    // 需要对中文转码 gb2312
    $file_name=iconv("utf-8","gb2312",$file_name);
    //绝对路径
    $file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
    //如果你希望绝对路径

    // 判断文件是否存在
    if(!file_exists($file_path)){
        echo "文件不存在!";
        return ;
    }
     // 打开文件
    $fp=fopen($file_path,"r");

    //获取下载文件的大小
    $file_size=filesize($file_path);
    if($file_size>50){

        echo "<script language='javascript'>window.alert('文件过大')</script>";
        return ;
    }
     // 设置HTTP协议的请求头参数
    //返回的文件
    header("Content-type: application/octet-stream"); //通用所有的格式
    //按照字节大小返回
    header("Accept-Ranges: bytes");
    //返回文件大小
    header("Accept-Length: $file_size");
    //这里客户端的弹出对话框,对应的文件名
    header("Content-Disposition: attachment; filename=".$file_name);
    //向客户端回送数据

    $buffer=1024;
    //为了下载的安全,我们最好做一个文件字节读取计数器
    $file_count=0;
    //这句话用于判断文件是否结束
    while(!feof($fp) && ($file_size-$file_count>0) ){
        $file_data=fread($fp,$buffer);
        //统计读了多少个字节
        $file_count+=$buffer;
        //把部分数据回送给浏览器;
        echo $file_data;
    }
    //关闭文件
    fclose($fp);
    }
    //测试函数是否可用
    down_file("zhangsan.jpg","/data/download/"); //第二个参数必须是根路径
?>

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言