Nginx Lua 限制访问 - 使用 UA 匹配,无 if 语句
以下是实现要求的 Nginx 配置文件代码,可放在宝塔 Nginx 配置文件的 http 部分中:
http {
lua_shared_dict qyuc 10m;
init_worker_by_lua_block {
local qyuc_dict = ngx.shared.qyuc
qyuc_dict:set('QYUC_UA', 'qyuc')
}
map $http_user_agent $qyuc {
default '';
~*qyuc $qyuc;
}
server {
listen 80;
server_name example.com;
location / {
access_by_lua_block {
local qyuc_dict = ngx.shared.qyuc
if not qyuc_dict:get('QYUC_UA') then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
# 此处为需要限制访问的内容
}
}
}
以上代码中,首先创建了一个名为 qyuc 的共享内存字典,用于保存允许访问的 UA 信息。在 init_worker_by_lua_block 中,将 qyuc 的值设为 'qyuc'。
接下来使用 map 指令,将请求中的 User-Agent 与 'qyuc' 进行匹配,如果匹配成功,则将 $qyuc 变量设为 'qyuc',否则变量值为空。
在 location 块中,使用 access_by_lua_block 指令,将需要限制访问的内容包裹起来。在该指令中,首先获取 qyuc_dict 字典中 key 为 'QYUC_UA' 的值,如果该值不存在,则说明没有设置允许访问的 UA 信息,此时直接返回 403 Forbidden 状态码,拒绝访问。如果该值存在,则说明允许访问的 UA 为 'qyuc',此时检查请求中的 User-Agent 是否为 'qyuc',如果不是,则同样返回 403 Forbidden 状态码,拒绝访问。
以上代码实现了只有 User-Agent 为 'qyuc' 的请求才能访问限制内容的功能,且未使用 if 语句。
原文地址: https://www.cveoy.top/t/topic/nwCe 著作权归作者所有。请勿转载和采集!