Nginx - OpenResty简易实现nginx的token验证和动态跳转
OpenResty简易实现nginx的token验证和动态跳转
首先在电脑上搭建OpenResty环境:https://www.cnblogs.com/helios-fz/p/15703260.html
然后创建一个 test.lua 文件:
-- 获取请求头 local headers = ngx.req.get_headers() -- 获得请求头中的 token 参数 local token = headers["token"] if token then -- 这里连接了本地redis,如果有密码,需要加上 -a 参数 local cmd = "redis-cli -h 127.0.0.1 -p 6379 -n 0 get "..token local f = io.popen(cmd) res = tostring(f:read()) f:close() -- 这里判断 redis 中是否存在 token if res ~= " " then -- 在这里可以加一些复杂逻辑 return "http://www.baidu.com" else return "https://www.cnblogs.com/helios-fz/" end else return "https://www.cnblogs.com/helios-fz/" end
在 nginx.conf 文件中加入配置:
server { listen 8005; server_name localhost; location / { resolver 8.8.8.8; set_by_lua_file $full_proxy_pass 你文件的绝对路径/test.lua; proxy_set_header Host $proxy_host; proxy_pass $full_proxy_pass; } }
这里有两个关键配置,如果不加上,跳转的时候就会报404错误
关键配置一
proxy_set_header Host $proxy_host;
语法 | proxy_set_header field value ; |
默认值 |
proxy_set_header Host $proxy_host; proxy_set_header Connection close; |
上下文 | http, server, location |
proxy_set_header 允许重新定义或者添加发往后端服务器的请求头。
value可以包含文本、变量或者它们的组合。
当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
所以上述 nginx.conf 如果不重新定义 proxy_set_header Host 的话,那么默认 Host 值就还是当前访问路径的 Host 信息。
关键配置二
resolver 8.8.8.8;
官方解释如下:
Configures name servers used to resolve names of upstream servers into addresses
反向代理的场景下,upstream后端用域名时,配置resolver以便于nginx能够解析该域名。
平时我们在配置NG upstream 时,一般都是指定 IP 地址或者是地址池,或者是一个固定的域名。
但一些复杂的场景,比如我们的 upstream 是变量的 servername,这时候需要用到resolver 的指令用来对变量做解析了。