当前位置: 首页 > news >正文

304详解 gzip压缩 虚拟主机

304缓存

缓存氛围两种

1.强制缓存

强制缓存就是服务器对客户端说多久之内不要再请求我了 直接找缓存

2.协商对比缓存

每次发请求 但是我们服务器可以对比一下,如果可以缓存直接返回304,也可以返回新的内容

cache-control :no-cache 强制缓存

Expires 过期时间 绝对过期时间

last-modified 对比缓存

没有变化返回304 有变化返回内容

if-modifed-since

 

 

浏览器

//etag

if-none-match

mime.getType

setHeader('Cache-Control',‘max-age=10’)

// 10秒内不请求我

setHeader('Expires',new Date(Date.now()+10*1000)).toGMTString())

// 兼容方法

浏览器disable-cache 全部禁用缓存

不能一直设置强制缓存

换粗 策略应该配合协议缓存

文件的最后修改时间告诉客户端

res.setHeader('Last-Modified',statObj.ctime.toGMTString())

浏览器再次来时 会带一个头req.headers['if-modified-since']

if you这个时间 和我上次的是不是一个 如果是 则走缓存 返回304 否则 返回新的文件

res.statsCode = 304 res.end()

createReadStream(realPath).pipe(res)

有误差

文件修改频繁 时间可能会有偏差

一秒内改了多次

CDN文件分配到不同服务器上 分发时间不同导致缓存失效

etag 的方式配合

111 xxx

xxx helloword xxs

文件内容判断

需要读取文件的内容对比

md5摘要算法 不叫加密算法 不可逆

require('crypto')// 加密用

node自带核心模块

sha1 sha256

crypto.createHash('md5').update('helloword').digest('base64')

md5摘要的长度是一样的 new Buffer()

加盐算法

sha1 sha256n 多了一个密钥 cookie

let scret = 'jasd'

crypto.createHmac('sha256',scret).update('sds').digest('base64')

res.setHeader('Etag','')

let re =fs.createReadStream(realPath);

rs.on('data',function(data){

md5.update(data)

})

res.on('end',function(){

let r = md5.digest('base64');

if(res.headers['if-no-match']===r){

res.statusCode = 304

res.end()

} else {

res.createReadStream(realPath).pipe(res)

}

res.setHeader('Etag',r)

res.setHeader('content-Type',mime.getType(realPath))

 

})

if-none-match 搭配使用

两种对比缓存 一种强制缓存 CDN频繁修改文件的需要另一种缓存

对比文件

 

压缩

compress:true

压缩转化流

zlib = require('zlib') // 核心模块

gzip

响应头

Content-Encoding:gzip

let fs=require('fs')

let file = fs.createReadStream('./download.txt')

file.pipe(zlib.createGzip()).pipe(fs.createWriteStream('1.gz'))

 

浏览器会询问我支持哪种压缩

Accept-Encodinng:gzip,deflate,br

服务器Content-Encoding:gzip 使用了哪种压缩

 

res.headers['accept-encoding']

encoding.test(/\bgzip\b/)

 

 

host 主机 host === referer 防盗链

虚拟主机

两个域名 挂在同一个服务器上

都是80端口

www.zh1.cn 代理localhost:3001

www.zh2.cn 代理 locahost:3002

代理 跨域proxy

常见的两种代码

正向代理 知道代理的存在 跳版机代理服务器做验证

反向代理 。 nginx 不知道代理的存在

nginx做负载均衡 转发到不同的服务器上

showdowbox

http-proxy 实现http代理 基于request

http-proxy-middleware

require('http-proxy')

let map = {

'w1.cn':'http://localhost:4000',

'w2.cn':'http://localhost:4001'

}

let http = require('http')

let proxy = httpProxy.createProxyServer()

http.createServer(function(req,res){

let head = req.headers['host']

proxy.web(req,res,{

target:map[head]

})

})

// 反响代理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 看Borland IDE向何处去
  • jwt原理
  • 我的BCB情缘
  • koa session 签名 cookie等
  • 作了Redhat Linux的基础课测试,刚好达到及格的标准,还是要多加学习啊!
  • express精简
  • react hooks1
  • CC2e:《代码大全(第2版)》集萃
  • js 数组API之every、some用法
  • 整理一个ANT在J2EE项目中的应用,含预编译JSP和打包WAR/EAR文件!
  • Taro解决低版本内核 兼容ES6语法问题Object.entries is not a function
  • git add . 增加所有文件到缓存区 git diff 什么也没有 因为无法比较差异 如果git add 某一个文件 则可以查看变动文件
  • 英语标准答案
  • react hooks 之 useState
  • react hooks useEffect
  • 2017-08-04 前端日报
  • GraphQL学习过程应该是这样的
  • Laravel 中的一个后期静态绑定
  • linux安装openssl、swoole等扩展的具体步骤
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Python打包系统简单入门
  • Spark RDD学习: aggregate函数
  • vagrant 添加本地 box 安装 laravel homestead
  • vue-router 实现分析
  • 分布式事物理论与实践
  • 前端代码风格自动化系列(二)之Commitlint
  • 通过npm或yarn自动生成vue组件
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一个JAVA程序员成长之路分享
  • 硬币翻转问题,区间操作
  • Java性能优化之JVM GC(垃圾回收机制)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • # 数据结构
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $.ajax()方法详解
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (solr系列:一)使用tomcat部署solr服务
  • (二)springcloud实战之config配置中心
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (算法二)滑动窗口
  • (小白学Java)Java简介和基本配置
  • (一)Dubbo快速入门、介绍、使用
  • (已解决)什么是vue导航守卫
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)可以带来幸福的一本书
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .net通用权限框架B/S (三)--MODEL层(2)