locations: Lua 库实现 nginx 风格的 location uri 匹配
安装
如果您尚未设置 RPM 仓库订阅,请 注册。然后您可以继续以下步骤。
CentOS/RHEL 7 或 Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-locations
CentOS/RHEL 8+、Fedora Linux、Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-locations
要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua。
本文档描述了 lua-resty-locations v0.2,发布于 2017 年 8 月 31 日。
Lua 库实现 nginx 风格的 'location' uri 匹配。
作为 nginx 的 location 功能。 支持最长前缀匹配、正则匹配、不区分大小写的正则匹配和精确匹配。
- 首先检查精确匹配,命中后返回搜索结果。
- 然后检查前缀匹配,并记住最长匹配。
- 如果前缀匹配有
^~修饰符,搜索返回 - 正则表达式按顺序检查
- 如果没有正则匹配,返回最长前缀
概述
init_by_lua_block {
local locations = require("resty.locations")
my_locs = locations:new()
-- 前缀匹配
local ok, err = my_locs:set("/foo", "/foo")
-- 精确匹配
local ok, err = my_locs:set("/bar", "= /bar", "=")
-- 正则匹配
local ok, err = my_locs:set("^/baz", "~ ^/baz", "~")
-- 不区分大小写的正则匹配
local ok, err = my_locs:set("^/qux", "~* ^/qux", "~*")
-- 前缀匹配,不检查正则
local ok, err = my_locs:set("/bazfoo", "^~ /bazfoo", "^~")
}
server {
listen 80 default_server;
server_name locations;
location / {
content_by_lua_block {
local val, err = my_locs:lookup(ngx.var.uri)
if val then
-- 根据 val 做一些事情
ngx.say("匹配: ", val)
else
if err then
ngx.log(ngx.ERR, err)
end
ngx.exit(404)
end
}
}
}
方法
new
语法: my_locations, err = locations:new(size?)
创建一个新的 resty-locations 实例,带有可选的初始大小
set
语法: ok, err = my_locations:set(key, value, modifier?)
添加一个新的键及其关联值和修饰符,默认值为空字符串用于前缀匹配。 键必须是字符串。 失败时返回 false 和错误消息。
修饰符与 nginx location 功能相同。
* ` (空字符串) - 前缀匹配
*=- 精确匹配
*~- 正则匹配
*~*- 不区分大小写的正则匹配
*^~` - 前缀匹配,跳过正则
lookup
语法: val, err = my_locations:lookup(uri)
检索提供的 uri 的值。 失败时返回 nil 和错误消息
GitHub
您可以在 nginx-module-locations 的 GitHub 仓库 中找到此模块的其他配置提示和文档。