EdgeJS规则配置方法

内容分发网络 CDN

  • 产品服务等级协议SLA
  • 功能发布记录
  • 产品描述
    • 名词解释
    • 产品优势
    • 应用场景
    • 产品简介
    • 性能数据参考
    • 性能指标
  • 安全防护能力
    • DDoS 安全防护(收费)
    • 业务安全防护(收费)
    • HTTPS 相关(免费)
    • 跨省盗刷分析(公测免费)
    • 访问控制(免费)
    • Web 应用防火墙(收费)
    • 云防护(收费)
  • 快速入门
    • 开通加速服务
    • 配置CNAME
    • 添加加速域名
    • 域名归属验证
    • 域名准入要求
  • 操作指南
    • 多用户访问控制
    • 常用工具
    • 用量查询
    • 标签管理
    • URL配置
    • 资源账单
    • 云监控
    • 统计分析
      • 服务月报
      • 查看分析数据
      • 统计分析概述
      • 查看WAF防护数据
      • 查看实时监控数据
      • 数据类型
        • TOP类数据
        • 回源类数据
        • 命中率类数据
        • 性能类数据
        • 状态码类数据
        • 流量带宽类数据
        • 用户访问类数据
    • 证书域名管理
      • 证书格式说明
      • 添加域名证书
      • HTTPS证书配置
    • 日志管理
      • 动态加速日志
      • 实时日志推送
      • 离线日志下载及转储
      • 日志管理概述
    • EdgeJS边缘服务
      • EdgeJS规则配置方法
      • EdgeJS配置步骤
    • 域名管理
      • 域名配置复制
      • 域名检索
      • 域名操作
      • 域名管理概览
    • 增值服务
      • 安全防护管理
    • 配置域名
      • 动态加速配置
      • 国密HTTPS配置
      • 高级设置
        • 页面优化
        • 设置视频拖拽
        • 页面压缩
        • 用量封顶配置(原带宽阈值设置)
        • 图片处理
        • 设置HTTP头
        • SEO优化配置
        • WAF配置
      • 访问控制
        • 设置单请求响应限速
        • 设置跨域访问
        • 高级鉴权
        • M3U8高级鉴权改写
        • 远程鉴权
        • 设置防盗链
        • 设置IP访问限频
      • 回源配置
        • 回源跟随301 302
        • 同运营商回源
        • 回源超时配置
        • 回源SNI配置
        • Range回源
        • 获取真实用户IP
        • 回源忽略参数
        • 私有Bucket回源
        • 离线模式
      • HTTPS配置
        • 配置HTTPS
        • 配置HSTS
        • 配置HTTPS双向认证
        • 配置TLS
        • 配置HTTP 2
        • 配置OCSP Stapling
        • HTTP3、QUIC 协议配置
      • 缓存配置
        • 配置移动访问
        • 配置URI重写
        • 配置域名共享缓存
        • 设置错误码页面自定义
        • 配置缓存过期时间
        • 配置忽略参数
      • 域名详情
        • 源站配置
        • 基本信息
        • 业务类型变更
        • 条件源站
    • 刷新预热
      • 刷新缓存
      • 查看操作记录
      • 子账户刷新预热
      • 刷新预热概述
      • 预热缓存
    • 资源包
      • 购买资源包
      • 自动续订
      • 查看资源包
  • 最佳实践
    • 通过 CDN 动态加速将数据上传到 BOS
    • 使用 CDN 加速 BOS 资源
  • API参考
    • API 发布记录
    • 调用说明
    • API概述
    • 用量查询
    • 日志接口
    • 域名操作接口
      • 停用加速域名接口
      • 查询用户名下所有域名
      • 查询域名是否备案
      • 域名列表查询
      • 单域名复制接口
      • 创建加速域名接口
      • 查询域名是否可添加
      • 启用加速域名接口
      • 删除加速域名接口
      • 查询域名归属权验证方法
    • 缓存管理接口
      • 查询预热状态
      • 刷新缓存
      • 查询刷新预热额度
      • 查询刷新状态
      • 预热缓存
    • 工具接口
      • IP查询接口
      • url封禁相关接口
    • 动态加速接口
      • 查询动态加速域名列表
      • 配置域名动态加速规则
    • 域名配置接口
      • 查询加速域名详情接口
      • 域名配置并行更新
      • 标签管理接口
        • 更新域名标签
        • 查询域名标签
      • 访问控制接口
        • 查询Cors跨域
        • 查询访问ua控制
        • 设置域名限速
        • 设置访问鉴权
        • 查询访问Referer控制
        • 设置访问Referer控制
        • 设置访问ua控制
        • 设置Cors跨域
        • 设置访问IP控制
        • 查询IP访问限频
        • 查询域名限速
        • 查询访问IP控制
        • 设置IP访问限频
      • 缓存配置接口
        • 设置缓存过期规则
        • 查询移动访问控制
        • 查询URI重写
        • 查询缓存共享
        • 设置缓存参数过滤规则
        • 查询缓存过期规则
        • 设置移动访问控制
        • 查询自定义错误页面
        • 设置URI重写
        • 设置缓存共享
        • 设置自定义错误码页面
        • 查询缓存参数过滤规则
      • 高级设置接口
        • 查询页面压缩
        • 查询IPv6
        • 设置离线模式
        • 查询带宽封顶
        • 查询用量封顶
        • 设置HttpHeader
        • 查询页面优化
        • 设置视频拖拽
        • 设置QUIC
        • 设置页面压缩
        • 设置IPv6
        • 查询离线模式
        • 设置用量封顶
        • 设置带宽封顶
        • 设置SEO开关属性
        • 查询QUIC
        • 查询SEO开关属性
        • 查询视频拖拽
        • 查询HttpHeader
        • 设置页面优化
      • 回源配置接口
        • 查询回源错误重试条件
        • 查询同运营商回源
        • 查询回源SNI
        • 查询回源超时
        • 查询回源地址(新版)
        • 设置Range回源
        • 查询回源地址(旧版)
        • 设置同运营商回源
        • 设置获取真实用户IP
        • 查询Range回源
        • 设置回源协议
        • 设置回源SNI
        • 查询获取真实用户IP
        • 设置回源地址(旧版)
        • 查询回源忽略参数
        • 设置回源地址(新版)
        • 设置回源跟随302
        • 设置回源超时
        • 查询回源协议
        • 查询回源跟随302
        • 设置回源忽略参数
        • 设置回源错误重试条件
      • HTTPS相关接口
        • 查询HTTPS配置
        • 查询HTTP3
        • 查询OCSP配置
        • 设置HSTS配置
        • 设置HTTPS加速
        • 设置HTTP3
        • 设置OCSP配置
        • 查询HSTS配置
        • 证书批量操作
          • 批量上传证书
          • 查询开启https域名
        • 证书关联操作
          • 删除域名证书
          • 查询域名证书
          • 增加&修改域名证书
    • 统计接口
      • 统计接口(旧版)
      • 统计接口(新版)
      • xcdn统计
      • 上行流量峰值
      • 上行流量统计
  • 常见问题
    • 计费类问题
    • 使用类问题
    • 证书类问题
    • 常见问题总览
    • 性能类问题
    • 安全类问题
    • 配置类问题
    • 故障类问题
  • 视频专区
    • 操作指南
    • 产品介绍
  • 产品定价
    • 计费概述
    • 欠费停服说明
    • 增值服务计费
    • 变更计费方式
    • 资源包说明
    • 基础服务计费
      • DRCDN基础服务计费
      • CDN基础服务计费
  • SDK
    • Python-SDK
      • 统计接口(旧版)
      • 工具接口
      • 统计接口(新版)
      • 缓存管理
      • 动态加速接口
      • 推荐的使用方式
      • 版本变更记录
      • 加速域名管理
      • CdnClient
      • 日志接口
      • 快速入门
      • 安装SDK工具包
      • 概述
      • 加速域名配置
        • 缓存配置
        • HTTPS相关配置
        • 访问控制
        • 高级设置
        • 回源配置
        • 域名配置并行更新
    • Java-SDK
      • 工具接口
      • 缓存管理
      • 动态加速接口
      • 推荐的使用方式
      • 版本变更记录
      • 加速域名管理
      • CdnClient
      • SDK日志级别设置
      • 统计与日志接口
      • 快速入门
      • 安装SDK工具包
      • 概述
      • 域名配置
        • 缓存配置接口
        • HTTPS相关接口
        • 高级设置接口
        • 加速域名配置
        • 回源配置接口
        • 证书关联操作
        • 访问配置接口
    • Go-SDK
      • 工具接口
      • 统计接口(新版)
      • 缓存管理接口
      • 域名配置接口
      • 动态加速接口
      • 推荐的使用方式
      • 版本变更记录
      • CdnClient
      • 日志接口
      • 域名操作接口
      • 快速入门
      • 安装SDK工具包
      • 概述
    • PHP-SDK
      • 缓存管理
      • 动态加速接口
      • 统计接口(旧)
      • 推荐的使用方式
      • 统计接口(新)
      • 工具类接口
      • 版本变更记录
      • 加速域名管理
      • CdnClient
      • 日志接口
      • 快速入门
      • 安装SDK工具包
      • 概述
      • 加速域名配置
        • 缓存配置
        • 访问控制
        • https设置
        • 高级设置
        • 回源配置
        • 获取加速域名配置
所有文档
menu
没有找到结果,请重新输入

内容分发网络 CDN

  • 产品服务等级协议SLA
  • 功能发布记录
  • 产品描述
    • 名词解释
    • 产品优势
    • 应用场景
    • 产品简介
    • 性能数据参考
    • 性能指标
  • 安全防护能力
    • DDoS 安全防护(收费)
    • 业务安全防护(收费)
    • HTTPS 相关(免费)
    • 跨省盗刷分析(公测免费)
    • 访问控制(免费)
    • Web 应用防火墙(收费)
    • 云防护(收费)
  • 快速入门
    • 开通加速服务
    • 配置CNAME
    • 添加加速域名
    • 域名归属验证
    • 域名准入要求
  • 操作指南
    • 多用户访问控制
    • 常用工具
    • 用量查询
    • 标签管理
    • URL配置
    • 资源账单
    • 云监控
    • 统计分析
      • 服务月报
      • 查看分析数据
      • 统计分析概述
      • 查看WAF防护数据
      • 查看实时监控数据
      • 数据类型
        • TOP类数据
        • 回源类数据
        • 命中率类数据
        • 性能类数据
        • 状态码类数据
        • 流量带宽类数据
        • 用户访问类数据
    • 证书域名管理
      • 证书格式说明
      • 添加域名证书
      • HTTPS证书配置
    • 日志管理
      • 动态加速日志
      • 实时日志推送
      • 离线日志下载及转储
      • 日志管理概述
    • EdgeJS边缘服务
      • EdgeJS规则配置方法
      • EdgeJS配置步骤
    • 域名管理
      • 域名配置复制
      • 域名检索
      • 域名操作
      • 域名管理概览
    • 增值服务
      • 安全防护管理
    • 配置域名
      • 动态加速配置
      • 国密HTTPS配置
      • 高级设置
        • 页面优化
        • 设置视频拖拽
        • 页面压缩
        • 用量封顶配置(原带宽阈值设置)
        • 图片处理
        • 设置HTTP头
        • SEO优化配置
        • WAF配置
      • 访问控制
        • 设置单请求响应限速
        • 设置跨域访问
        • 高级鉴权
        • M3U8高级鉴权改写
        • 远程鉴权
        • 设置防盗链
        • 设置IP访问限频
      • 回源配置
        • 回源跟随301 302
        • 同运营商回源
        • 回源超时配置
        • 回源SNI配置
        • Range回源
        • 获取真实用户IP
        • 回源忽略参数
        • 私有Bucket回源
        • 离线模式
      • HTTPS配置
        • 配置HTTPS
        • 配置HSTS
        • 配置HTTPS双向认证
        • 配置TLS
        • 配置HTTP 2
        • 配置OCSP Stapling
        • HTTP3、QUIC 协议配置
      • 缓存配置
        • 配置移动访问
        • 配置URI重写
        • 配置域名共享缓存
        • 设置错误码页面自定义
        • 配置缓存过期时间
        • 配置忽略参数
      • 域名详情
        • 源站配置
        • 基本信息
        • 业务类型变更
        • 条件源站
    • 刷新预热
      • 刷新缓存
      • 查看操作记录
      • 子账户刷新预热
      • 刷新预热概述
      • 预热缓存
    • 资源包
      • 购买资源包
      • 自动续订
      • 查看资源包
  • 最佳实践
    • 通过 CDN 动态加速将数据上传到 BOS
    • 使用 CDN 加速 BOS 资源
  • API参考
    • API 发布记录
    • 调用说明
    • API概述
    • 用量查询
    • 日志接口
    • 域名操作接口
      • 停用加速域名接口
      • 查询用户名下所有域名
      • 查询域名是否备案
      • 域名列表查询
      • 单域名复制接口
      • 创建加速域名接口
      • 查询域名是否可添加
      • 启用加速域名接口
      • 删除加速域名接口
      • 查询域名归属权验证方法
    • 缓存管理接口
      • 查询预热状态
      • 刷新缓存
      • 查询刷新预热额度
      • 查询刷新状态
      • 预热缓存
    • 工具接口
      • IP查询接口
      • url封禁相关接口
    • 动态加速接口
      • 查询动态加速域名列表
      • 配置域名动态加速规则
    • 域名配置接口
      • 查询加速域名详情接口
      • 域名配置并行更新
      • 标签管理接口
        • 更新域名标签
        • 查询域名标签
      • 访问控制接口
        • 查询Cors跨域
        • 查询访问ua控制
        • 设置域名限速
        • 设置访问鉴权
        • 查询访问Referer控制
        • 设置访问Referer控制
        • 设置访问ua控制
        • 设置Cors跨域
        • 设置访问IP控制
        • 查询IP访问限频
        • 查询域名限速
        • 查询访问IP控制
        • 设置IP访问限频
      • 缓存配置接口
        • 设置缓存过期规则
        • 查询移动访问控制
        • 查询URI重写
        • 查询缓存共享
        • 设置缓存参数过滤规则
        • 查询缓存过期规则
        • 设置移动访问控制
        • 查询自定义错误页面
        • 设置URI重写
        • 设置缓存共享
        • 设置自定义错误码页面
        • 查询缓存参数过滤规则
      • 高级设置接口
        • 查询页面压缩
        • 查询IPv6
        • 设置离线模式
        • 查询带宽封顶
        • 查询用量封顶
        • 设置HttpHeader
        • 查询页面优化
        • 设置视频拖拽
        • 设置QUIC
        • 设置页面压缩
        • 设置IPv6
        • 查询离线模式
        • 设置用量封顶
        • 设置带宽封顶
        • 设置SEO开关属性
        • 查询QUIC
        • 查询SEO开关属性
        • 查询视频拖拽
        • 查询HttpHeader
        • 设置页面优化
      • 回源配置接口
        • 查询回源错误重试条件
        • 查询同运营商回源
        • 查询回源SNI
        • 查询回源超时
        • 查询回源地址(新版)
        • 设置Range回源
        • 查询回源地址(旧版)
        • 设置同运营商回源
        • 设置获取真实用户IP
        • 查询Range回源
        • 设置回源协议
        • 设置回源SNI
        • 查询获取真实用户IP
        • 设置回源地址(旧版)
        • 查询回源忽略参数
        • 设置回源地址(新版)
        • 设置回源跟随302
        • 设置回源超时
        • 查询回源协议
        • 查询回源跟随302
        • 设置回源忽略参数
        • 设置回源错误重试条件
      • HTTPS相关接口
        • 查询HTTPS配置
        • 查询HTTP3
        • 查询OCSP配置
        • 设置HSTS配置
        • 设置HTTPS加速
        • 设置HTTP3
        • 设置OCSP配置
        • 查询HSTS配置
        • 证书批量操作
          • 批量上传证书
          • 查询开启https域名
        • 证书关联操作
          • 删除域名证书
          • 查询域名证书
          • 增加&修改域名证书
    • 统计接口
      • 统计接口(旧版)
      • 统计接口(新版)
      • xcdn统计
      • 上行流量峰值
      • 上行流量统计
  • 常见问题
    • 计费类问题
    • 使用类问题
    • 证书类问题
    • 常见问题总览
    • 性能类问题
    • 安全类问题
    • 配置类问题
    • 故障类问题
  • 视频专区
    • 操作指南
    • 产品介绍
  • 产品定价
    • 计费概述
    • 欠费停服说明
    • 增值服务计费
    • 变更计费方式
    • 资源包说明
    • 基础服务计费
      • DRCDN基础服务计费
      • CDN基础服务计费
  • SDK
    • Python-SDK
      • 统计接口(旧版)
      • 工具接口
      • 统计接口(新版)
      • 缓存管理
      • 动态加速接口
      • 推荐的使用方式
      • 版本变更记录
      • 加速域名管理
      • CdnClient
      • 日志接口
      • 快速入门
      • 安装SDK工具包
      • 概述
      • 加速域名配置
        • 缓存配置
        • HTTPS相关配置
        • 访问控制
        • 高级设置
        • 回源配置
        • 域名配置并行更新
    • Java-SDK
      • 工具接口
      • 缓存管理
      • 动态加速接口
      • 推荐的使用方式
      • 版本变更记录
      • 加速域名管理
      • CdnClient
      • SDK日志级别设置
      • 统计与日志接口
      • 快速入门
      • 安装SDK工具包
      • 概述
      • 域名配置
        • 缓存配置接口
        • HTTPS相关接口
        • 高级设置接口
        • 加速域名配置
        • 回源配置接口
        • 证书关联操作
        • 访问配置接口
    • Go-SDK
      • 工具接口
      • 统计接口(新版)
      • 缓存管理接口
      • 域名配置接口
      • 动态加速接口
      • 推荐的使用方式
      • 版本变更记录
      • CdnClient
      • 日志接口
      • 域名操作接口
      • 快速入门
      • 安装SDK工具包
      • 概述
    • PHP-SDK
      • 缓存管理
      • 动态加速接口
      • 统计接口(旧)
      • 推荐的使用方式
      • 统计接口(新)
      • 工具类接口
      • 版本变更记录
      • 加速域名管理
      • CdnClient
      • 日志接口
      • 快速入门
      • 安装SDK工具包
      • 概述
      • 加速域名配置
        • 缓存配置
        • 访问控制
        • https设置
        • 高级设置
        • 回源配置
        • 获取加速域名配置
  • 文档中心
  • arrow
  • 内容分发网络CDN
  • arrow
  • 操作指南
  • arrow
  • EdgeJS边缘服务
  • arrow
  • EdgeJS规则配置方法
本页目录
  • 概述
  • 特性
  • 语法
  • JavaScript全局特性
  • HTTP请求对象r
  • Crypto
  • Async/Await
  • WebCrypto
  • baidu_utils库
  • Base64
  • 场景示例
  • 文件名改写
  • 跨域访问
  • 重定向
  • 访问控制
  • IP黑白名单
  • Referer黑白名单
  • UA黑白名单
  • 限速
  • B类鉴权
  • 修改请求uri
  • 修改请求args
  • 修改请求header
  • 修改响应header
  • A/B Test
  • 自定义错误页面
  • 遍历所有请求头
  • 远程鉴权
  • Async/Await
  • SubtleCrypto

EdgeJS规则配置方法

更新时间:2025-08-21

概述

EdgeJS为您提供可编程的自定义边缘配置服务,百度率先支持nginx扩展js对象,支持在边缘节点执行您自己编写的JavaScript代码。性能高,时延低,部署配置简单,帮助您快速定制化业务,极大降低业务实现成本。

特性

  • 与请求生命周期绑定的VM。
  • 非堵塞的执行过程。
  • 基于ECMAScript标准实现。注意:目前和ECMAScript 5.1(严格模式 strict mode)是兼容的,仅支持部分ECMAScript 6特性
  • 与请求处理阶段紧密集成。

语法

JavaScript全局特性

  • Object/String/JSON/Date/RegExp/Function/Promise/Array/ArrayBuffer/Number/Math等等
  • 同ECMAScript标准,参考 JavaScript 标准内置对象。

HTTP请求对象r

请求对象r子成员 描述
r.uri 请求uri,可写
r.args{} 请求参数对象,可写。
r.headersIn{} 请求头对象,可写。
Foo请求头可以使用r.headersIn.foo或者r.headersIn['Foo']来访问。
"Host", "Connection", "If-Modified-Since", "If-Unmodified-Since", "If-Match", "If-None-Match", "User-Agent", "Referer", "Content-Length", "Content-Range", "Content-Type", "Range", "If-Range", "Transfer-Encoding", "TE", "Expect", "Upgrade", "Accept-Encoding", "Via", "Authorization", "Keep-Alive", "X-Real-IP", "Accept", "Accept-Language", "Depth", "Destination", "Overwrite", "Date",这些请求头只能有一个,重复的会被忽略。
重复的“Cookie”请求头,会返回所有的重复部分,并以分号(;)分隔。重复的其他请求头,会返回所有的重复部分,并以逗号(,)分隔。
r.headersIn.foo = 'foo',赋值会覆盖所有的重复部分。r.headersIn['Foo'] = ['a', 'b'],赋值数组,会产生两个重复的请求头:Foo: a和Foo: b。
r.rawHeadersIn{} 请求头KV Array,只读。
请求头Host: localhost Foo: bar foo: bar2输出类似于['Host', 'localhost'], ['Foo', 'bar'], ['foo', 'bar2']
获取所有的请求头foo可使用r.rawHeadersIn.filter(v=>v[0].toLowerCase() == 'foo').map(v=>v[1]),输出['bar', 'bar2']。
r.headersOut{} 响应头对象,可写。
Foo响应头可以使用r.headersOut.foo或者r.headersOut['Foo']来访问。
"Server", "Date", "Content-Length", "Content-Encoding", "Location", "Refresh", "Last-Modified", "Content-Range", "Accept-Ranges", "WWW-Authenticate", "Expires", "E-Tag", "ETag", "Content-Type", "X-Override-Charset", "Cache-Control", "Link", "Age", "Retry-After",这些响应头只能有一个,重复的会被忽略。
重复的"Set-Cookie"响应头,会返回一个数组,例如r.headersOut['Set-Cookie'].forEach(element => console.log(element))。重复的其他响应头,会返回所有的重复部分,并以逗号(,)分隔
r.headersOut.foo = 'foo',赋值会覆盖所有的重复部分。r.headersOut['Foo'] = ['a', 'b'],赋值数组,会产生两个重复的响应头:Foo: a和Foo: b。
r.rawHeadersOut{} 响应头KV Array,只读。
用法类似于r.rawHeadersIn{}。
r.respHeader(callback) 响应头处理callback注册方法。在callback中可以对后端传递的r.headersOut、r.status进行修改。
r.return/r.send/r.sendHeader/r.finish/r.respHeader无法工作在callback里面。
r.httpVersion http协议版本,0.9/1.0/1.1,只读。
r.method http方法,GET/HEAD/PUT/POST等,只读。
r.remoteAddress 客户端地址,只读。
r.variables{} nginx变量对象,部分可写。
设置限速可使用r.variables['limit_rate']。
r.rawVariables{} 类似r.variables{},只读,返回Buffer。

响应处理方法 描述
r.status 设置响应码,可写。
r.sendHeader() 发送http响应头给客户端。
先通过r.status设置状态码,r.headersOut{}设置响应头,然后使用r.sendHeader()发送响应头,如果有响应体,再通过r.send(string)发送响应体。
如果没有响应体,则调用r.finish()结束。
r.send(string) 发送一部分响应string给客户端,发送完成时调用r.finish()结束。
r.finish() 结束请求处理,响应完成。
r.return(status[, string]) 指定响应码status,并同时发送整个响应string给客户端,后续不能再调用r.send(string)发送响应。
可以用来重定向,status指定301、302、303、307或者308,重定向URL作为第二个参数。
注意:这个方法并不能结束js代码的运行,如果想结束脚本,必须在r.return之后使用return全局关键字退出js代码。

调试打印 描述
console.log(string/obj) 打印string或者obj到调试窗口里面。
console.dump(string/obj) 同console.log,格式化输出。

Fetch 描述
ngx.fetch(url, [options]) 类似于JavaScript原生的Fetch,请求URL,并返回解析Response对象的Promise。
重定向需要调用者处理,options支持body / headers / method/verify。
选项verify表示,是否开启ssl证书校验,默认开启。
sni和Host头保持一致,不设置默认为参数url中的域名部分
Response 同JavaScript原生的Response。支持arrayBuffer() / bodyUsed / headers(get(name)/getAll(name)/has(name)) / json() / ok / redirected / status / statusText / text() / type / url。

Crypto

提供密码类函数支持,通过require('crypto')返回来使用。

Hash 描述
crypto.createHash(algorithm) 创建并返回hash对象,使用给定的algorithm生成hash摘要。
algorithm支持md5、sha1和sha256。
hash.update(data) 使用给定的data更新hash计算结果。
hash.digest([encoding]) 通过hash.update()传递的所有data,计算其hash摘要
encoding支持hex、base64和base64url,不指定默认为byte string。

HMAC 描述
crypto.createHmac(algorithm, secret key) 创建并返回HMAC对象,使用给定的algorithm和secret key。
algorithm支持md5、sha1和sha256。
hmac.update(data) 使用给定的data更新HMAC计算结果。
hmac.digest([encoding]) 通过hmac.update()传递的所有data,计算其hmac摘要
encoding支持hex、base64和base64url,不指定默认为byte string。

Async/Await

async/await可以以更舒适的方式处理 Promise。同JavaScript规范

WebCrypto

同JavaScript规范SubtleCrypto接口

Plain Text
1crypto = require('crypto').webcrypto
2var subtlecrypto = crypto.subtle;

baidu_utils库

function ipInCidr(ipv4, cidrs)

Plain Text
1参数:
2    ipv4为点分十进制的ipv4地址,比如'192.168.2.100'
3    cidrs为CIDR地址列表,比如['192.168.1.1/32','192.168.2.1/24']
4 
5使用示例:
6    if (baidu_utils.ipInCidr('192.168.2.100', ['192.168.1.1/32','192.168.2.1/24'])) {
7        r.return(403);
8    }

Base64

编码

Plain Text
1'1234'.toBytes().toString('base64');
2'1234'.toBytes().toString('base64url');
3require('crypto').createHash('sha1').update('A').update('B').digest('base64');
4require('crypto').createHmac('sha1', 'key').update('A').update('B').digest('base64url');

解码

Plain Text
1String.bytesFrom('MTIzNA==', 'base64');
2String.bytesFrom('MTIzNA', 'base64url');

场景示例

文件名改写

Plain Text
1r.headersOut['Content-Disposition']='attachment;filename=' + '\"' + r.args['filename'] + '\"';

跨域访问

Plain Text
1r.headersOut['Access-Control-Allow-Origin']=r.headersIn['Origin'];

重定向

Plain Text
1r.return(302, '/a');

访问控制

IP黑白名单

Plain Text
1if (baidu_utils.ipInCidr(r.remoteAddress, ['192.168.1.1/32','192.168.2.1/24'])) { r.return(403); }

Referer黑白名单

Plain Text
1var refers = ['http://*.baidu.com.cn/*','http://*.baidu.com/*'];
2var i = 0;
3for (; i < refers.length; i += 1) {
4    if (baidu_utils.matchWildcard(r.headersIn['referer'], refers[i])) {
5        r.return(403);
6        return;
7    }
8}

UA黑白名单

Plain Text
1var uas = ['curl','AppleWebKit'];
2var i = 0;
3var ua = r.headersIn['User-Agent'];
4for (; i < uas.length; i += 1) {
5    if (ua.includes(uas[i])) {
6        r.return(403);
7        return;
8    }
9}

限速

Plain Text
1r.variables['limit_rate'] = '1k';

B类鉴权

Plain Text
1var part = r.uri.substr(1).split('/');
2if (part.length < 3) {
3    r.return(403);
4    return;
5}
6 
7var date_in_uri = part[0];
8var d = new Date('');
9d.setFullYear(date_in_uri.substring(0, 4));
10d.setMonth(date_in_uri.substring(4, 6) - 1); //the month (0-11) in the specified date
11d.setDate(date_in_uri.substring(6, 8));
12d.setHours(date_in_uri.substring(8, 10));
13d.setMinutes(date_in_uri.substring(10));
14var time = d.getTime();
15var timeout = 1000000000000; // not overdue
16if (time + timeout < Date.now()) {
17    r.return(403);
18    return;
19}
20 
21var md5_in_uri = part.splice(1,1)[0];
22var md5_str = 'bdcloud666' + part.join('/');
23var md5 = require('crypto').createHash('md5').update(md5_str).digest('hex');
24if (md5_in_uri != md5) {
25    r.return(403);
26    return;
27}

修改请求uri

Plain Text
1r.uri = '/test';

修改请求args

Plain Text
1r.args['test1'] = 'test';
2if (r.args['test1'] == 'test') { /* use first one if duplicate */
3    delete r.args['test2'];
4    delete r.args['test']; /* remove all duplicate arg */
5}
6 
7r.args['gy'] = 'test';  /* remove all duplicate arg, add a new one */
8r.variables['args'] = 'test=test'; /* set entire args directly */

修改请求header

Plain Text
1var xff = r.headersIn['X-Forwarded-For'] + ', ';
2r.headersIn['X-Forwarded-For'] = xff.substring(0, xff.length - 2);

修改响应header

Plain Text
1function done() {
2    r.headersOut['dup'] = 'dup';
3}
4r.respHeader(done);

A/B Test

Plain Text
1if (r.args['a']) {
2    r.args['version'] = 'new';
3}
4else if (r.args['b']) {
5    r.args['version'] = 'old';
6}

自定义错误页面

Plain Text
1function done() {
2    if (r.status == 404) {
3        r.status = 302;
4        r.headersOut['Location'] = 'http://www.baidu.com/test';
5    }
6}
7 
8r.respHeader(done);

遍历所有请求头

Plain Text
1function myFunc(item, index) {
2    console.log(item);
3    // action
4}
5r.rawHeadersIn.forEach(myFunc);

远程鉴权

Plain Text
1ngx.fetch('https://www.baidu.com/auth')
2.then(function(response) {
3    if (!response.ok) {
4        return r.return(403, 'forbidden');
5    }
6})
7.catch(e => console.log(e.message));

Async/Await

Plain Text
1function pr(x) {
2    return new Promise(resolve => {resolve(x)});
3}
4 
5async function add(x) {
6    const a = await pr(x);
7    throw a + 1;
8    const b = await pr(x + 10);
9    return a + b;
10}
11 
12add(50).then(v => {console.log(v - 1)}).catch(v => console.log(v));

SubtleCrypto

Plain Text
1if (typeof crypto == 'undefined') {
2    crypto = require('crypto').webcrypto;
3}
4
5let dkey = await crypto.subtle.importKey('raw', params.key,
6                                   {name: params.name},
7                                   false, ['decrypt']);
8 
9let ekey = await crypto.subtle.importKey('raw', params.key,
10                                   {name: params.name},
11                                   false, ['encrypt']);
12 
13let enc = await crypto.subtle.encrypt(params, ekey, params.data);
14let plaintext = await crypto.subtle.decrypt(params, dkey, enc);
15plaintext = Buffer.from(plaintext);

上一篇
日志管理
下一篇
EdgeJS配置步骤