http进阶

前言:php

  上一篇博文已经说到了,apache2.4简单的配置,端口,持久链接,MPM,DSO,路径下基于来源控制,页面特性,日志设置css

安全域,虚拟主机等等。html

 

一:URLweb

 URL是互联中获取标记资源的方式,URL的组成由URL方案(scheme),服务器地址(ip+port)和资源路径构成。例如http://www.xxyy.com/bbs/index.indexapache

 语法:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>vim

  1. scheme:资源的访问方法,例如http,ftp
  2. user:password:访问网站的帐号密码,通常只用于http协议自己的Basic认
  3. host:主机地址
  4. port:端口号,http协议默认使用80
  5. path:(/)下相对http主页下的相对资源路径
  6. params:参数,url能提供多个参数中间使用&隔开
  7. query:查询语句,问号(?)以后调用查询语句,多个语句使用&隔开
  8. frag:片段,相似书签,可以标识网络资源中的具体地址 

  这里重点介绍query和frag:后端

    query是简单的调用查询语句,在搜索引擎中一般将其键值输出给其引擎,例如:http://www.baidu.com/baidu?&ie=utf-8&word=1浏览器

    frag相似于书签的功能,可以准确标明资源中的片断,例如:http://baike.baidu.com/item/黄蓉?fr=aladdin#2_5缓存

2、协议安全

 http协议是一种无状态(stateless)协议,自身不能辨认客户端,没法追踪访问者来源。虽然tcp/ip协议在必定程度上辅助http确认客户端来源,可是在某些特定状况下,好比keepalive的时候,不会第一时间断开tcp链接可以在未达到访问限制以前的无限请求资源,这种状况下tcp/ip协议并不能发挥做用。

   若是这时候刷新一下页面,购物车里的物体所有消失(这样的世界真美好),连买买买的自由都没有,何谈用户体验。

   因此嘛,须要一种机制可以准确的追踪客户端来源,标识客户端,此方式表示cookie机制。

   当客户端第一次访问某站点时,站点响应客户端资源,同时会发送一串惟一的随即数据,也就是cookie,以便标记客户端。cookie会记录客户端全部的访问行为,且有着属于本身的的做用范围,换言之,只要访问同一站点,皆会被服务器辨识。

   不过,因为全部的访问行为都由cookie记录,同时也就注定自身安全性不足。

   任何人,只要可以获取到某用户的cookie,便能彻底访问过去该用户所进行的全部资源。

   显然,存在缺陷的cookie,并不能让用户彻底的放心使用。这就须要另外一种全新的机制,即轻cookie+session

   轻cookie一样保存用户信息,但却不记录用户的访问行为,访问行为由服务器经过session机制进行保存。(session保存着客户端的精简数据结构)

   当用户第一次访问站点时,站点一样是响应资源和发送cookie,只是此后全部的访问行为都是存储在服务器的RAM中,每次访问都会跟新其值。

   服务器经过cookie和session两者结合的数据结构便能辨别客户端。

   固然,这仅仅只是精简的说明。

3、事务:

  http事务:

 请求:request

    响应:response

 

        报文语法:

    request:

      <method><request:URL><version>

      <headers>

 

      <request>

      response:

      <version><status><reason-phrase>

      <headers>

 

      <entity-body>

    method:请求方法:标明客户端但愿服务器对资源执行的操做

  GET:从服务器上获取资源

  HEAD:只从服务器上获取响应首部

       POST:向服务器发送要处理的数据

       PUT:将请求的主体部分存储在服务器上

  DELETE:删除服务器上的文档

  TRACE:追踪请求到服务器过程当中通过的代理服务器

  OPTIONS:请求服务器放回对指定资源使用的请求方法

 这里主要讨论POST和PUT区别,POST方法做用于一个资源集(bbs/)上,PUT方法做用于一个具体资源(bbs/index.html)上,换句话说POST至关于建立一个资源会生成全新的URL,且每次使用POST都是建立全新资源,(一般而言,服务器不容许过多的建立文件),而PUT至关于更新资源,即不管操做多少次都不会出现不一样URL,且PUT方法自己是幂等的。

    version:HTTP的版本号

    status:状态码,如201,304,403

      常见状态码:

    200:成功,请求的全部数据经过响应报文的entity-body发送;ok

    301:请求的URL指向的资源已经被删除,但响应报文经过首部Location指向如今的新位置;Moved Permanently

    302:与301类似,但在响应报文中透过首部Location指明资源临时新位置;Found

    304:客户端发起条件式请求,但服务器端资源没有发生改变,则经过响应此状态码回应客户端;Not Modifed

       401:须要输入帐号密码才能访问;Unauthorized

       403:请求被拒绝;Forbidden

       404:服务器没法找到客户端请求的资源;Not Found

       505:服务器内部错误;internal Server Error

       502:代理服务器从后端服务器收到了一条伪响应;bad Gateway

    reason-phrase:

   状态码的简易描述

     headers:

         每一个请求或响应报文可包含任意首部;每一个首部都有首部名称,后面跟一个冒号,然后跟上一个空格,接着一个值

    格式:

                Name: value

         首部分类:

                 通用首部

                 请求首部

                 响应首部

                 实体首部

                 扩展首部

         通用首部:

                 Date:报文响应日期

                 connecttion:链接方式,如keepalive

                 Via:显示报文通过的中间节点

                 cache-Control:缓存控制

                 pragma:HTTP1.0缓存

          请求首部:

      Accept:告诉服务器端本身可接受的的MIME类型

                Accept-Charset          可接受的字符集

                Accept-Encoding        可接受的编码格式,如gzip

                Accept-Language       可接受的语言

                

                Host:请求服务器的名称和端口号

                Referer:告诉服务器本身是从哪一个页面跳转过来的

                User-Agent:客户端代理

         条件是请求首部:

          Expect:但愿服务器发送的

               If-Modifed-since:自从某个时间点后资源是否发生变化

               If-Unmodifed-since:自从某个时间点后资源是否没有发生变化

               If-None-Match:本地缓存中的文档的ETag标签是否与服务器端ETag的不匹配

               if-Match:本地缓存中的文档的ETag标签是否与服务器端ETag的匹配

         安全请求首部:

               Authorization:向服务器提供认证信息,如账号密码

              cookie:向服务器端发送cookie

         代理请求首部:

               Proxy-Authorization:相代理服务器认证

         响应首部:

              Age:响应持续时长

             Server:服务器程序名称和版本

         协商响应首部:

             Accept-Ranges:服务器可接受的请求范围

             Vary:服务器查看的其余首部列表(之中包含都是可变化的值)

          安全响应首部:

             Set-Cookie:向客户端设置cookie

             www-Authenticate   服务器端对客户端的咨询认证表单

          实体首部:

              Allow:列出对资源可请求的方法

    Location:告诉客户端真正实体位于何处

    Content-Ecoding:主体编码格式

         Content-Language:主体语言

         Content-Lengh:主体长度

         Content-Location:主体真正所在位置

         Content-type:主体类型

   缓存相关:

    ETag:实体扩展的标签

    Expires:实体过时的时间

    Last-Modifed:主体最后一次修改的时间

  这里主要讨论Vary、Location、Content-Location的区别,放入Vary的首部信息的内容皆是不肯定的可变化的值,当须要获取一个不肯定值时,即可将其放入。

  好比Vary:Accept-Ecoding可以使得服务器端获取各式各样的编码格式。

  如此在缓存服务器下,不一样资源即是采起不一样的缓存编码,css,jpg的静态资源启动gzip;php则不采起缓存。

  再好比,Vary:User-agent可以使得缓存服务器根据不一样的浏览器类型缓存不一样的内容

  Location和Content-Location皆是指明主体资源真正的所在位置,前者指的是重定向的地址,后者指的时可以直接访问资源的地址,不须要进一步内容协商。

  entity-body:

  文档主体,使用PUT和POST方法才有主体,通常而言使用GET方法没有主体信息

  

  一次完整http事务由http请求和http响应构成,请求报文和响应报文包含大量的headers来描述资源之间的交换。经过了解首部信息,可以判断资源是否可以完成的基本标准。

  更重要的是,可以经过首部进行负载均衡。

4、https

  http是明文协议,注定了信息的不安全性。

  https协议即是http的通讯加密方式。

  https协议先进行tcp/443三次握手,以后进行ssl回话握手,随后再进行http协议。http和http除却tcp链接以外,还多进行了一次ssl握手,进行ssl握手以后全部进出的信息皆会被加密。

  ssl位于传输层和应用层之间的半层,因此进行传输前必需要后tcp创建ssl链接,先tcp断开ssl链接。

  注:https进行加密传输,一定会有额外消耗,在高负载的状况下会给CPU极大的压力,因此通常须要可以缓存ssl回话的硬件缓存,以便减小服务器压力。

  如下是SSL简易会话过程:

   (1)客户端发送可供选择的加密方法发送给服务器端

      (2)服务器端发送证书及选定的加密方法给客户端

   (3)验证证书:

      若是信任发证书的CA:

 

                     (a)验证证书来源合法性,用CA的公钥解密证书上数字签名

 

                            (b)验证证书的内容合法性,完整性验证

 

                            (c)检查证书的有效期限

 

                            (d)检查证书是否被吊销

 

                            (e)证书中拥有者的姓名,与访问的目标主机要一致

   (4)客户端生成临时会话密钥(对称密钥),并使用服务器端侧的公钥加密发送服务器端,完成密钥交换

    (5)服务器用此密钥加密用户请求的资源,响应给客户端

  注:ssl是基于IP地址建立的,因此单IP主机上,仅可使用一个https虚拟主机(通常而言)

       如下,内部网络的私有CA创建过程及ssl回话过程。

#cd /etc/pki/CA     #创建私有CA,在另外一条主机上完成
#(umask 077;openssl genrsa -out private/cakey.pem 2048)  #密钥
#touch index.txt
#echo 01> serial
#openssl req -new x509 -key private/cakey.pem -out cacert.pem -days 7200  #私有证书

  

#cd /etc/httpd/                   #客户端
#mkdir ssl
#cd ssl
#(umask 077;openssl genrsa -out httpd.key 1024)  #生成密钥
#openssl req -new -key httpd.key -out httpd.csr  -days 3600  #证书签署请求
#scp httpd.csr root@172.16.100.1:/tmp      #发送给服务器

  

#openssl ca -in /tmp/httpd.csr -out certs/httpd.crt -days 3600   #CA服务器签署证书
#ls certs/
#scp certs/httpd.crt root@192.168.139.134:/etc/httpd/ssl/      #发还给客户端

 

#yum -y install mod_ssl                #客户端
#cd /etc/httpd/conf.d    
#cp ssl.conf{,.bak}
#vim ssl.conf
    DocumentRoot “/vhosts/web2htdocs”
    ServerName web1.xxyy.com
    SSLCertificateFile /etc/httpd/ssl/httpd.crt     #证书文件,签署过的证书
    SSLCertificateKeyFile /etc/httpd/ssl/httpd.key    #密钥

  

<VirtualHost *:80>          #在虚拟主机设置中打开SSL引擎
SSLengine on
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

  以上,即是SSL的简易配置。

相关文章
相关标签/搜索