V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dzdh
V2EX  ›  PostgreSQL

怎么做正则二级域名泛解析格式的查询

  •  
  •   dzdh · 2022-01-21 16:59:04 +08:00 · 2171 次点击
    这是一个创建于 1030 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如库里:

    domain
    *.baidu.com
    a.baidu.com
    select * from 'b.baidu.com' ~* domain;
    

    报错 ERROR: invalid regular expression: quantifier operand invalid

    第 1 条附言  ·  2022-01-21 18:31:39 +08:00
    select * from domains where  domain ~* 't.baidu.com'
    
    10 条回复    2022-01-23 23:37:22 +08:00
    qwerthhusn
        1
    qwerthhusn  
       2022-01-21 17:23:04 +08:00
    like '%.baidu.com'
    alsotang
        2
    alsotang  
       2022-01-21 17:39:18 +08:00
    from 后面不是应该跟 table 名称吗
    liuxu
        3
    liuxu  
       2022-01-21 17:58:37 +08:00
    这个帖子问的太过分了,我 google 都不想帮你贴了
    dzdh
        4
    dzdh  
    OP
       2022-01-21 18:30:47 +08:00
    @alsotang 忽略。。。sql 手打的漏了。。有表名的
    dzdh
        5
    dzdh  
    OP
       2022-01-21 18:33:03 +08:00
    @qwerthhusn 根据什么把传过来的参数给去掉呢

    如果参数是 a.baidu.com ,可以 去掉第一位 三级四级咧
    jinliming2
        6
    jinliming2  
       2022-01-21 22:01:40 +08:00
    @dzdh 没看懂,什么叫“根据什么把传过来的参数给去掉呢”
    SELECT * FROM domains WHERE domain ~* '^[^\.]+\.baidu\.com$'; -- 这个可以只匹配二级域名,而不匹配三级、四级等
    如果你是想指定匹配一级域名的话,那比较困难,因为一级域名的后缀是一个很长的列表,比如 .com 、.cn 这类只有一个尾缀的,还有 .com.cn 这类有两个尾缀的,还有 google 这样的公司名域名( https://domains.google ),还有 .中国 .中國 .香港 .個人.香港 这类一个尾缀或两个尾缀的中文域名……
    列表应该是 https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat 的 ===BEGIN ICANN DOMAINS=== 到 ===END ICANN DOMAINS=== 中间的部分
    0ZXYDDu796nVCFxq
        7
    0ZXYDDu796nVCFxq  
       2022-01-21 22:39:23 +08:00 via Android
    查两次,一次 `domain`=='b.baidu.com'
    没结果则把主机名替换成*,b.baidu.com --> *.baidu.com
    然后 `domain`=='*.baidu.com'
    dzdh
        8
    dzdh  
    OP
       2022-01-23 02:55:10 +08:00
    @jinliming2

    其实就是库里存了一堆证书 certs: cn varchar (*.baidu.com, baidu.com, a.baidu.com), cert, priv

    想实现 ,根据当前 host 取出对应的证书。比如 host 是 a.baidu.com ,就取 a.baidu.com 的证书,是 xx.baidu.com 就取出 *.baidu.com 的证书,host 是 baidu.com 就取出 baidu.com 的证书
    jinliming2
        9
    jinliming2  
       2022-01-23 21:26:47 +08:00
    @dzdh emmmm ,不知道我理解的对不对:
    data:;base64,U0VMRUNUIENPQUxFU0NFKAogIChTRUxFQ1QgKiBGUk9NIGRvbWFpbnMgV0hFUkUgZG9tYWluID0gJ2FhLmJhaWR1LmNvbScpLAogIChTRUxFQ1QgKiBGUk9NIGRvbWFpbnMgV0hFUkUgZG9tYWluID0gUkVHRVhQX1JFUExBQ0UoJ2FhLmJhaWR1LmNvbScsICdeW14uXSsnLCAnKicpKQopOw==
    用 COALESCE 分成两次查询,第一次绝对匹配,能匹配到直接返回,匹配不到的话,再进行第二次匹配。第二次先用正则把域名开头的子域名替换为 * 再进行绝对匹配。因为通配符证书只能匹配一级子域名,所以只需要 replace 一级。

    P.S.: 额,直接发 SQL 被 CloudFlare 拦截了……
    dzdh
        10
    dzdh  
    OP
       2022-01-23 23:37:22 +08:00
    @jinliming2 最终决定改动入参用 or 了。。openresty 的 lua

    select cert,priv from certs where domain = '*.baidu.com' or domain = 'a.baidu.com'
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2643 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:31 · PVG 13:31 · LAX 21:31 · JFK 00:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.