HTTP协议

参考书籍:《HTTP权威指南》

1、http://www.baidu.com:80/index.php/user=kkk&passwd=xxx

协议//主机的IP或域名[:端口]/路径/请求参数

特殊字符要用%进行转义编码。

只允许客户端向服务器主动发送请求,服务器不会主动向客户端发送数据。Resquest-Response

2、请求行 请求头  请求正文             响应行 响应头  响应正文

1xx --服务器已接收请求,继续处理

2xx-服务器已成功处理了请求

3xx-重定向

4xx-客户端错误

5xx-服务端错误

200、302(重定向)、404(请求资源不存在)、400(客户端请求有语法错误)、401(请求未经授权)、403(服务器)收到请求,但拒绝提供服务、500(服务器内部错误)、503(服务器当前不能处理客户端的请求,可能少会儿可以)

常见的请求头:Host、User-Agent、Referer、Cookie、Range(多线程用到)、x-forward-for(请求端的ip)

常见的响应头:Server、Set-Cookie、Last-Modified、Location

3、HTTPS比HTTP多了SSL,端口用443,需要证书

4、MIME type:给不同的数据格式打标签

web服务器会给所有HTTP对象数据附加一个MIME类型。MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由/分开。

5、URI:统一资源定位符。唯一标识并定位信息资源。URL是URI最常见的形式。几乎所有的URI都是URL。URI的第2种形式是URN,还不成熟。

6、HTTP/1.0第一个广泛使用的HTTP版本,HTTP/1.1是当前使用的版本,HTTP-NG/HTTP/2.0终止于1998。

7、使用telnet模拟http客户端,telnet www.baidu.com 80                       Ctrl + ]           sen   GET / HTTP/1.1

8、报文由三个部分组成,起始行、首部、主体。起始行和首部都是ascll文本,而主体则可以是任意类型文件,比如二进制,视频等!且起始行和首部都已一个crlf作为结束符,并且首部与主体之间应始终存在一个以crlf序列作为结束的空行。当然了为了兼容老版本的http,这里有时并不是那么严格要求非要crlf同时存在!

首部分类:主要有五类:通用首部、请求首部、响应首部、主体首部、扩展首部。通用首部就是请求报文和响应报文都可以用,用以说明报文的一般属性;请求首部出现在请求报文中,用于客户端告诉服务器是什么情况,比如能接受什么,不能接受什么等;响应报文用于响应报文中,服务器端用来告诉客户端什么情况;主体首部用来描述主体的信息,比如主体的长度是多少等;扩展报文是非官方的报文,但是http也支持发送。

  • GET方法用于请求服务器端发送某个资源

  • HEAD方法跟GET方法类似,区别就是不返回主体

  • PUT方法用于向服务器端修改、插入数据

  • POST方法用于向服务器端发送数据

  • TRACK方法用于向服务器端请求报文在发送的过程中经过了什么修改,主要用于测试

  • OPTIONS用于请求服务器告知其支持什么功能

  • DELETE用于向服务器删除某个指定的资源

  • 扩展方法其实类似于自定义方法

  • 9、性能聚焦区域

  • 小的http事务可能会在tcp链接建立上花费50%时间;延迟确认就是想在后面的ACK中捎带一些数据而进行了延迟确认前面的报文;

  • 慢启动:刚开始时会限制TCP传输速度,等到数据传输成功时再逐渐提高速度

  • Nagle算法:在发送之前试图将大量tcp数据绑在一起,提高网络传输效率

TIME_WAIT端口耗尽:最近关闭的IP-PORT会保持一个2MSL的缓存,这个IP-port不能被用来重新建立连接。可用端口只有60000个,如果2MSL=2min,则连接率要低于500。

优化方法:

并行连接

    通过多条TCP连接发起并发的HTTP连接

    持久连接

    重用TCP连接,以消除连接及关闭时延

    管道化连接

    通过共享的TCP连接发起并发的HTTP请求

keep-alive已经不再使用了,timeout,max,哑代理问题

HTTP 1.1默认开了persistent-alive持久连接,需要在响应中Connection:close把他关闭。

连接可以在任意时刻被关闭。

10、web服务器响应流程

多线程及多进程web服务器;I/O复用;

11、代理

代理和网关的对比:代理的两端使用相同的协议,而网关的两端使用不同的协议,网关负责协议转换!

  • 主要使用代理作以下功能使用:

         1、儿童过滤器:如服务器响应的成人内容进行过滤

          2、文档访问控制:验证客户端访问某个的文件需要的证书

          3、安全防火墙:提供一个防火墙保护客户端或服务器

          4、web缓存(缓存资源的副本):对客户端响应资源的副本,节省带宽、减少网络拥堵

           5、反向代理(原始服务的替代物,能访问其他服务器,作服务器加速器使用):反向代理伪装成原始服务器,不过与服务器不同的是反向代理还可以向其他服务器发送请求,以便实现按需定位所请求的内容!

             6、内容路由器:比如网络中实现为了一些付费用户提供更好、更快的网络速度,让请求发往缓存服务器,而没有付费的用户请求则发往更远或原始服务器!

              7、转码器(比如改变图片格式,以便更轻巧利于传输)

              8、匿名者:保护客户端隐私

  • 按部署代理的位置代理可以分为一下几种:

            1、出口代理:部署在本地网络端,用于保护本地网络或者限制公司带宽

             2、访问(入口)代理:用于实现提供缓存响应

             3、反向代理:部署在服务器端本地网络上,用于实现更精确的请求和提供性能

             4、网络交换代理:部署在网络上,用于检测流量等

http请求报文是怎么进入代理的:

              1、修改客户端:比如现在的客户端都支持收手动和自动配置代理!

               2、修改网络:网络通过一些技术在客户端不知情的情况揽入流量进入代理!

                3、修改dns命名空间:把主机名映射为代理的ip地址,比如修改系统的dns映射文件,让代理伪装成原始服务器,从而把web请求导入代理!

                 4、修改服务器:让服务器返回一个重定向有关的代码,把http请求报文导入到代理!

主要介绍客户端配置代理的几种常见方式,如下:

  • 手工配置 : 显示地设置要使用的代理
  • 预先配置浏览器 : 浏览器厂商或发行商会在将浏览器发送给其客户之前预先对浏览器(或所有其他的Web客户端)的代理设置进行手工配置
  • 代理的自动配置(Proxy Auto-Configuration,PAC):一个代理配置的js文件,客户端在请求之前会取回这个js文件,从而判断如何决定使用代理
  • WPAD的代理发现 : 略
  •         

追踪报文:

  • 现在代理请求逐步流行的情况下,需要一种机制来追踪我们的报文经过了那些节点。此时报文中via字段就是一个描述报文在代理中逐级传输的过程中所经过代理的方式!如下:
	GET /index.html HTTP/1.0
	Accept: text/html
	Host: www.joes-hardware.com
	Via: 1.1 proxy-62.irenes-isp.net,1.0 cache.joes-hardware.com

via字符告诉我们报文流经了两个代理。这个字符串说明第一个代理名为proxy-62.irenes-isp.net,它实现了HTTP/1.1协议,第二个代理被称为cache.joes-hardware.com,实现了HTTP/1.0。

Server响应首部字段对原始服务器使用的软件进行了描述,如下有几个例子:

  • Server: Apache/1.3.14 (Unix) PHP/4.0.4
  • Server: Netscape-Knterprise/4.1
  • Server: Microsoft-IIS/5.0

注:如果响应报文是通过代理转发的,一定要确保代理没有修改Server首部。Server首部是用于原始服务器的。代理应该添加的是Via首部。

12、缓存

使用缓存的优点:

  • 缓存减少了冗余的数据传输,因为毕竟每次http事务请求的东西都是一样的时候,多次发送同样的数据是不必要和冗余的!

  • 缓存缓解了网络瓶颈的问题,不需要更多的带宽就能够更快地加载页面!

  • 缓存降低了对原始服务器的要求,因为想象一下,从一个性能很差劲的原始服务器和从一个性能和牛逼的缓存服务器请求事务,肯定会弥补服务器的缺点的,同时也会减少服务器过载情况,因为大部分请求都由缓存代劳处理了!

  • 缓存降低了距离时延,因为从较远的地方加载页面会更慢一些!

缓存命中:

  • *缓存命中与缓存未命中:*一次http事务请求如果是从得到的响应是从缓存得到的原始响应副本,那么这样的过程就称之为缓存命中。反之,如果缓存没有响应的副本,而要去请求原始服务,那么就把这个过程称之为缓存未命中!

  • http再验证:原始响应内容是在变化的,所以缓存应该在文档“过期时间”之后去验证缓存的副本是不是新鲜的,这个过程就叫做http再验证!如果再验证之后得知缓存副本是新鲜的,那么原始服务器返回304 not modified。此时,称之为再验证命中缓存慢命中!如果得知缓存不是新鲜的,那么服务器返回200 ok。此时,称之为再验证未命中!如果原始对象已经被删除了,返回404 not found响应。相应地缓存副本要删除。(注:虽然再验证命中需要跟原始服务器沟通一次,但是它与直接请求服务器相比,还是要快一点,因为再验证命中只是返回了一些新的过期时间有关的新首部而已,并没有发送主体对象。)

  • 命中率指由缓存返回副本事务在全部事务中所占的比例,称为缓存命中率。这个数据实际中意义不是很大!而字节命中率从资源大小总量的角度说明缓存命中所占的比例。因为他从数据流量的角度出发,所以实际中这个数据的意义挺大的!

  • 区分命中和未命中,简单来说,http没有相应的机制来告知客户端响应是从缓存得到的还是从原始服务器得到的!但我们可以从http响应报文首部中的date字段得知这一情况:如果这个字段的时间比当前时间更早得多,说明这是从缓存得到的,因为date描述的服务器第一次响应的时间,而缓存是不会对这个字段进行修改的!

新鲜度

  • 文档过期通过特殊的http首部cache-control和expires,http让原始服务器为每个文档设置一个“过期时间”!如:
	
	Cache-Control: Max-Age=484200
	Expires: Fri, 28 Oct 2016 03:03:47 GMT
	

上面的Max-Age是相对时间,以秒为单位,理解为使用期,expires为绝对时间,为到期时间。

  • 服务器在验证,描述的过期的文档并不是就是原始服务器的原始文档不一样了,而是需要向服务器发起新鲜度验证请求。

  • 用条件方法进行再验证:涉及到的两个首部为If-Modified-Since和If-None-Match。格式为:

	If-Modified-Since: <date>

实际上上面那个date为服务器响应报文里面Last-Modified的时间。

  • If-None-Match:实体标签再验证!此种机制主要跟If-Modified-Since不同在于:If-Modified-Since是根据修改时间来判断文档新鲜度的,但有些情况这样做是不适用的,因为比如我们只是加了注释什么的,其中实际内容是没有变化的,此时我们也应该认为文档是新鲜的!

  • 强弱验证器:描述的是一种对内容的更改“严不严重,影不影响主要含义”的实体标签验证!

缓存如何将访问广告次数提供给供应商来获取收益呢?

13、网关、隧道和中继

web网关描述了客户端和服务器端使用了不同的协议,使用下面的表示方法来表示:

	<客户端协议>/<服务器端协议>

协议网关主要描述了几种架构在客户端和服务器端之间的网关,它们两侧使用了不同的协议来达到通信的目的,主要有:HTTP/*(服务器端web网关)、HTTP/HTTPS(服务器端安全网关)、HTTPS/HTTP(客户端安全网关加速器)。

Web隧道允许用户通过HTTP连接发送非HTTP流量,这样就可以在HTTP上捎带其他协议数据了。使用Web隧道最常见的原因就是要在HTTP连接中嵌入非HTTP流量,这样,这类流量就可以穿过只允许Web流量通过的防火墙了。

  • Web隧道使用HTTP的CONNECT方法建立起来的。 CONNECT方法并不是HTTP/1.1核心规范的一部分,但却是一种得到广泛应用的扩展。

  • CONNECT连接:除了起始行之外,CONNECT的语法与其他HTTP方法类似。一个后面跟着冒号和端口号的主机名取代了请求URL.主机和端口都比如指定:

	请求
	CONNECT home.netscape.com:443 HTTP/1.0
	User-Agent:Mozilla/4.0

	响应
	HTTP/1.0 200 Connection Established
	Proxy-agent:Netscape-Proxy/1.1

14、web机器人

  • 搜索引擎是web机器人用得最多的领域

  • 最初开始的搜索引擎就是一个简单的数据,哪里维护者一个用户可能搜索的信息列表。但如今的搜索引擎确实一个相当复杂的数据库,存储有大量信息,用了很多爬虫去爬取数据。所以对用户来说,搜索引擎的检索信息的速度以及爬虫获取数据的速度是搜索引擎需要必须考虑的问题。

  • 全文检索就是一个数据库,给它一个单词,它可以立即提供包含那个单词的所有文档。创建了索引之后,就不需要对文档自身进行扫描了。

  • 搜索引擎都有自己的排序算法,如相关性排名算法,如某个单词在很多内容都出现了,那么它的相关度就很高,所有与此单词有关的内容都应该排在考前。当然了这样的索引差不多在爬虫去获取内容的时候就已经建立起这种索引了

 

15、cookie机制

Cookie的属性

  • domain : cookie的域

  • allh : 那些主机可以使用此cookie

  • path :那些路径能使用cookie

  • secure : 是否在发送https报文的时候使用cookie

  • expires : 过期时间

  • name : cookie的名字

  • value : cookie的值

16、认证机制

基本认证:

  • 基本认证描述的就是用户第一次访问服务器的时候,服务器返回401状态码和WWW-Authenticate响应首部,并在首部中描述了密码编码算法和对应要使用密码的安全域,然后客户端弹框,在输入用户名和密码提交后。客户端发送含有Authorization首部的get请求申请验证身份,其中首部中携带了用户名和密码糅合在一起的编码后的验证码给服务器端,如果验证通过,那么服务器返回200的响应,并以Authentication-Info首部携带相关信息,以后用户就可以不用密码访问相关文件了!
  • 基本认证实现服务器端可以拒绝一个事务,并要求验证客户端信息,返回401状态码,发起质询/认证!

  • Base-64用户名/密码编码:是一种编码机制

  • 代理认证:就是代替服务器向客户端发起质询/认证,与服务器端发起的质询/认证主要有几点不同:质询的时候返回的是407状态码,服务器端质询返回的首部是Proxy-Authenticate,客户端认证时发送的是Proxy-Authorizatio首部,认证成功之后返回的是Proxy-Authentication-Info首部

  • 基本认证简单快捷,但并不安全(唯一安全用就是与SSL结合),存在以下缺陷:
  • 1、基本认证是采用网络以明文的方式发送用户名和密码,容易被别人捕获。

    2、即使是密文发送 ,也很容易被别人解码

    3、适用于很简单的会话服务

    4、没有中间节点的保护措施

    5、容易假冒服务器骗过基本认证

摘要认证:

重放攻击解决方法:随机数

  • 与基本认证相比,摘要认证虽不是最安全的认证方式,但却在以下几点上做了一些改进,以此来降低安全事务风险。

       1、永远不会以明文方式在网络上发送密码

        2、可以防止恶意用户捕获并重新认证的握手过程

        3、可以有选择地防止对报文内容的篡改

          4、防范其他几种常见的攻击方式

17、安全HTTP

对称加密:DES、RC2、RC4

非对称加密:RSA

数字签名是附加在报文上的特殊加密校验码。和非对称加密一起使用。

公钥加密,只有私钥能解密;私钥加密,所有公钥都能解密。

 

签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过,怎么样可以达到这个效果呢?一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。

一般把对称加密和非对称加密结合起来用:详情参考:https://blog.csdn.net/ptonlix/article/details/78912282

数字签名可以证明谁就是谁(私钥是唯一的),但是如何证明公钥不是黑户发布的咧?因为大家都可以生成公钥-私钥对。为了解决这个问题,数字证书出现了。数字证书原理:https://www.cnblogs.com/jtlgb/p/6187444.html

既然自己可以给自己签发证书,那黑客宣称自己是CA,然后给自己签发一个证书,那验证者如何来验证这个证书是黑客自己的呢还是CA呢?
这个问题,就是CA存在的意义了。
所谓全球权威的CA,就那么几个公司,这几个公司的证书,被各软件厂商设置成可信任的根证书了。至于这些CA是怎么把自己的数字证书交给软件厂商而且让他们信任自己,我也不知道。如果你知道了,你就可以自己给自己签发一个证书,交给微软的IE,或者firefox等,让他们把你的证书嵌入到软件里去。这样一来,你就成了全球权威的CA之一了!
现在知道了,自签发的数字证书,要被各软件信任,是不容易的。

 

  • 建立安全传输:https与http的不同就是,中间了增加了一次SSL握手的步骤。具体情况就是,https在建立tcp/ip连接之后还需要进行一次SSL层的传输连接工作连接,同时在关闭tcp/ip连接之前需要增加一次关闭SSL层的通知工作。

  • SSL握手过程中确定了以下工作细节:

            1、交换协议版本号;

            2、选择一个两端都了解的密码;

            3、对两端的身份进行认证;

            4、生成临时的会话秘钥,以便加密信道。

  • SSL握手步骤为:

               1、客户端发送可供选择的密码并请求证书

               2、服务器发送选中的密码和证书

                3、客户端发送保密信息;客户端和服务端生成秘钥

               4、客户端和服务器相互告知,开始加密过程

18、实体和编码

Content-Length是压缩后的大小?

内存编码和传输编码,内容编码针对主体,传输编码针对报文(传输编码主要是分块编码);

Content-Length:实体的大小

  • http的早期版本采用关闭连接的办法来划定报文的结束,但是,没有Content-Length的话,客户端就无法判别到底是报文结束时正常的连接关闭,还是报文传输中由于服务器崩溃而导致的连接关闭。客户端需要通过Content-Length来检测报文截尾。注意这个后果对于缓存是很严重的,可能造成缓存长时间用不完整的内容来响应客户端。

  • Content-Length与持久连接:拥有Content-Length就能对报文进行正确的分段

  • 内容编码:有时候服务器采用内容编码来压缩实体主体以节省空间,Content-Length描述的是压缩过后的长度或大小

  •  

确定实体主体长度的规则,以下规则,谁先匹配到就用谁:

        1、如果特定的HTTP报文类型中不允许带有主体,那么就忽略Content-Length首部。常见情况有:1XX、204以及304响应,还有HEAD方法的响应。

      2、如果报文中含有描述传输编码的Transfer-Encoding首部,那么实体就应由一个称为“零字节块”的特殊模式结束。

         3、如果报文中,有Content-Length首部而无Transfer-Encoding首部,那么Content-Length就是描述首部的长度。如果有Content-Length首部,同时也有Transfer-Encoding首部,那么就必须忽略Content-Length,因为传输编码会改变实体主体的表示和传输方式(因此可能就会改变传输的字节数)。

         4、如果报文使用了multipart/byteranges(多部分/字节范围)媒体类型,且无Content-Length首部,那么报文长度有报文去自定界。

          5、如果以上规则都不匹配,实体的长度就是关闭连接时所得到的的主体的长度。这个值实际上由服务器关闭连接得到。客户端关闭连接将使服务器无法响应。

19、其它

国际化:字符编码使用标准的MIME charset标记

内容协商技术从实现方式来说有三种:

         1、客户端驱动实现方式:客户端发起请求,服务器返回资源可用版本的列表,这种方式实现起来简单,但同时有个问题就是至少需要发送两次请求才能得到自己喜欢的响应(第一次获取列表,第二次才是得到资源),显然会造成时延、浪费带宽。

         2、服务器驱动实现方式:这种方式由服务器通过检测客户端发送过来的内容协商首部来主动决定发送相应版本的资源,涉及到著名q值检测技术。这种方式的问题就是,如果客户端的发送过来的相关首部不明确的话,那么就得服务器自己去判断了。

           3、透明方式(代理缓存处理):让代理代替客户端与服务器端进行协商,从而减轻了服务器端的请求压力。

主机托管服务

  • 专用托管:一台物理服务器对应一个主机

  • 虚拟主机托管:许多Web托管者通过让一些顾客共享一台计算机来提供便宜的Web主机托管服务,这称为共享主机托管或虚拟主机托管。每个网站看起来是托管在不同的服务器上,但实际上是托管在同一个物理服务器上。————但这并不意味着上千个网站是用一台PC机来提供服务的。托管者可以创建成排同样的服务器,称为服务器集群。

  • 重定向技术通常可以用来确定报文是否终结于某个代理、缓存或服务器集群中某台特定的服务器。重定向技术可以将报文发送到客户端没有显示请求的地方去。与此需要涉及到的技术:

1、HTTP重定向

2、DNS重定向

3、任播路由

4、策略路由

5、IP MAC转发

6、IP地址转发

7、WCCP(Web缓存协调协议)

8、ICP(缓存间通信协议)

9、HTCP(超文本缓存协议)

10、NECP(网元控制协议)

11、CARP(缓存阵列路由协议)

12、WRAD(Web代理自动发现协议)

  • 重定向原因如下:

1、 可靠地执行HTTP事务

2、最小化时延

3、节约网络带宽

日志记录:

  • 如果把访问的点点滴滴都一五一十的记录下来,是一个很没有意义的过程,暂且不说有的网站的事务量超大到难以计数的问题,把全部信息记录下来,这个日志文件可想而知得有多大。就日志记录对我们统计需求的作用而言,因为有的数据对我们来说意义不大,甚至可能看都不会看一眼,所以有选择性的记录一些内容变得很重要。通常,只记录事务的基本信息就行了。通常会记录下来的几个字段示例为:
  • HTTP方法:主要记录事务用了什么方法
  • 客户端和服务器的HTTP版本:给出客户端和服务器有关的提示,比如兼容性提示什么的
  • 所请求资源的URL:记录Web站点某个资源的访问频率和受欢迎程度
  • 响应的HTTP状态码:主要说明请求的执行情况成功与否
  • 请求和响应报文的尺寸(包含所有的实体主体部分):记录大小
  • 事务开始时的时间戳:记录发生时间
  • Referer首部和User-Agent首部的值:主要记录从那个页面跳过来以及用户代

HTTP字段梳理

http解码字段:

method:http方法

version:版本

uri:唯一标识定位

params:请求参数

host:RFC协议规定所有的HTTP请求必须携带Host头,即使Host没有值,也必须带上这个Host头附加一个空串,如果不满足,应用服务器应该抛出400 Bad Request。

x-forwarded-for:X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端真实 IP。X-Forwarded-For: client, proxy1, proxy2

referer:Referer是非常常用的头,它表示请求的发起来源URI,也就是当前页面资源的父页面。

status-code:响应码

req-content-length:描述HTTP消息实体的传输长度。消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。

rsp-content-length

rsp-messge

req-content-type:内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件

rsp-content-type

use-agent:携带当前的用户代理信息,一般包含浏览器、浏览器内核和操作系统的版本型号信息。它和Server头是对应的,一个是表达服务器信息,一个是表达客户端信息。

cookie:cookie值

post-body

link

location:服务器向客户端发送302跳转的时候,总会携带Location头信息,它的值为目标URL

set-cookie

range:支持断点续传的服务器必须处理Range头,它表示客户端请求资源的一部分时指定的请求字节范围。

proxy_authorization:同Authorization头部,用于代理服务器认证。

proxy_con

server:用于返回服务器相关的软件信息,来告知客户端当前的HTTP服务是由某某软件提供的,可以看成是一种软件广告。

req-content-encoding:编码方式

rsp-content-encoding

rsp-connection

content_location

data

via:该字段用来标识一个请求经过的网关路由节点。如果这个请求经过了多个代理层,Via头部就会有多个网关信息。

last_modified:标记资源的最近修改时间

pragma:一般仅用于前端开发模式,防止静态资源修改后前端得不到即时更新

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值