文章导航
一、pre-plugins和post-plugins概念介绍
两个插件都可以在路由、service中进行配置
pre-plugins:
表示在其他插件之前动态执行lua代码
post-plugins:
表示在其他插件之后动态执行lua代码
该lua代码无法执行一些不安全的操作:
string.rep
:可用于在一次操作中分配数百万字节{set|get}metatable
:可用于修改全局对象(字符串、数字)的元表collectgarbage
:可能被滥用来降低其他工人的绩效_G
:是可以访问所有函数的根节点它被临时表屏蔽load{file|string}
:因为它可以授予对全局环境的访问权限,因此被视为不安全raw{get|set|equal}
:由于沙盒依赖于某些元表操作,因此可能不安全string.dump
:可以显示服务器机密信息(例如功能的实现)math.randomseed
:可能会影响主机系统Kong Gateway 已经正确地为随机数生成器播种- 全部
os.*
(除os.clock
、os.difftime
和 之外os.time
)os.execute
均可显著改变主机系统 io.*
:提供对硬盘的访问dofile|require
:提供对硬盘的访问- 所有提供的模块(如
string
或table
)都是只读的,不能修改 - 字节码执行被禁用
- 指向
kong.cache
专用于 Serverless Functions 插件的缓存实例它不提供对全局 Kong Gateway 缓存的访问它仅公开方法无法使用或等get
显式写入操作setinvalidate
二、常用的kong function脚本
下列脚本可放入pre-plugins或post-plugins中
设置转发路径、设置header头
在pre-plugins中的Access块中填入如下代码:
return function()
-- 获取请求地址
local original_uri = kong.request.get_path()
-- 将/test2前缀去除,此处使用正则匹配,“-”需要被 “%” 转义
local new_uri = original_uri:gsub("^/test%-2/", "/")
-- 设置新的URI
kong.service.request.set_path(new_uri)
kong.service.request.add_header("ThisIsAHeader", "ThisIsHeaderValue")
-- 清除上一行设置的header头 "ThisIsAHeader"
kong.service.request.clear_header("ThisIsAHeader")
end
在function中拆分字符串,在日志中获取debug输出
return function()
-- 请求路由为: /test/route-1/
local original_uri = kong.request.get_path()
local result = {}
local from = 1
local delim_from, delim_to = string.find(original_uri, "/", from)
while delim_from do
table.insert(result, string.sub(original_uri, from, delim_from - 1))
from = delim_to + 1
delim_from, delim_to = string.find(original_uri, "/", from)
end
table.insert(result, string.sub(original_uri, from))
local parts = result
-- 下列语句的日志输出在/usr/local/kong/logs/的日志文件中可以看到
ngx.log(ngx.ERR, "parts[3] is : ", parts[3])
if parts[3] == "sdk-jd" then
kong.service.request.add_header("test-header", "test-headervalue")
local new_uri = original_uri:gsub("^/test/route%-1/", "/")
kong.service.request.set_path(new_uri)
else
kong.service.request.set_path("/path-unknown")
end
end
遍历数组中的元素
-- 遍历数组中的元素
local fruits = {"Apple", "Banana", "Cherry"}
for i = 1, #fruits do
print(fruits[i])
end
for循环
-- 使用for i模式
-- 起始,次数,步长
for i =0, 10, 1 do
print(i)
end
nil判断
local myVar = nil
if not myVar then
print("myVar is nil or false")
else
print("myVar has a value")
end
三、路由匹配规则(路径长度匹配低于正则匹配的优先级)
如果给定请求的规则数在两个路由A
和B
相同,则将按照列出的顺序应用以下规则进行决胜。如果满足以下条件,A
将优先选择路由B
:
A
仅具有“普通”主机标头,并且B
具有一个或多个“通配符”主机标头A
具有比更多的非主机标头B
A
至少有一个“正则表达式”路径,并且B
只有“普通”路径A
的最长路径比的B
最长路径长A.created_at < B.created_at