lua-resty-vhost

用于将主机名匹配到值的库。

$ opm get hamishforbes/lua-resty-vhost

#lua-resty-vhost

用于将主机名匹配到值的库。支持与 Nginx 的 server_name 指令相同的方式使用通配符和.hostname.tld语法。

.*.开头的键将匹配顶层域名及其所有子域名,最长匹配优先。非通配符匹配始终优先。

不支持正则表达式匹配和前缀通配符。

#概述

    lua_package_path "/path/to/lua-resty-vhost/lib/?.lua;;";
    
    init_by_lua_block {
        local vhost = require("resty.vhost")
        my_vhost = vhost:new()
        local ok, err = my_vhost:insert("example.com",      { key = "example.com.key",          cert = "example.com.crt" })
        local ok, err = my_vhost:insert("www.example.com",  { key = "example.com.key",          cert = "example.com.crt" })
        local ok, err = my_vhost:insert(".sub.example.com", { key = "star.sub.example.com.key", cert = "star.sub.example.com.crt" })
        local ok, err = my_vhost:insert("www.example2.com", { key = "www.example2.com.key",     cert = "www.example2.com.crt" })
    }
    
    server {
        listen 80 default_server;
        listen 443 ssl default_server;
        server_name vhost;
    
        ssl_certificate         /path/to/default/cert.crt;
        ssl_certificate_key     /path/to/default/key.crt;
    
        ssl_certificate_by_lua_block {
            local val, err = my_vhost:lookup(require("ngx.ssl").server_name())
            if not val then
                ngx.log(ngx.ERR, err)
            else
                ngx.log(ngx.DEBUG, "Match, setting certs: ", val.cert, " ", val.key)
                -- set_certs_somehow(val)
            end
        }
    
        location / {
            content_by_lua_block {
                local val, err = my_vhost:lookup(ngx.var.host)
                if val then
                    -- do something based on val
                    ngx.say("Matched: ", val.cert)
                else
                    if err then
                        ngx.log(ngx.ERR, err)
                    end
                    ngx.exit(404)
                end
            }
        }
    }

方法

new

语法: my_vhost, err = vhost:new(size?)

创建一个新的 resty-vhost 实例,并可以选择初始大小。

insert

语法: ok, err = my_vhost:insert(key, value)

添加一个新的主机名键及其关联的值。

键必须是字符串。

失败时返回 false 和错误消息。

lookup

语法: val, err = my_vhost:lookup(hostname)

检索与最佳匹配主机名条目关联的值。

失败时返回 nil 和错误消息。

##待办事项

  • 正则表达式匹配

  • 前缀匹配

  • Trie 压缩

作者

Hamish Forbes

许可证

mit

版本