【问题标题】:Regex how to match a substring that does not contain a fixed string. Regex in Traefik正则表达式如何匹配不包含固定字符串的子字符串。 Traefik 中的正则表达式
【发布时间】:2019-10-21 14:08:45
【问题描述】:

我有几个容器使用 traefik 和 docker-compose 在同一页面 (some.website.com) 中运行,我正在尝试制定一个规则,将每个请求与来自某个子域的引用者转发到相同的子域如果重定向上没有子域。

即:some.website.com/dolibarr/ 我尝试登录,但它发送给我:some.website.com/answer.php?whatever

我已经用 traefik 规则解决了这个问题,所以它会将我发送到: some.website.com/dolibarr/answer.php?whatever 但是还有其他几个子页面会将我发送到 some.website.com/,所以我必须为每个子页面制定一个规则。

我已有的traefik规则

labels:
      - "traefik.enable=true"
      - "traefik.backend=dolibarr"
      - "traefik.dolibarr.frontend.rule=Host:${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD};PathPrefixStrip:/${DOLIBARR_PATH}"
      - "traefik.dolibarr_url_fix.frontend.rule=Host:${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD};PathPrefix: /admin, /user, /expensereport, /index.php;HeadersRegexp: referer, ^https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/${DOLIBARR_PATH}/"
      - "traefik.dolibarr_url_fix.frontend.redirect.permanent=true"
      - "traefik.dolibarr_url_fix.frontend.redirect.regex=https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/dolibarr/(.*)"
      - "traefik.dolibarr_url_fix.frontend.redirect.replacement=https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/${DOLIBARR_PATH}/$$1"


正则表达式应该类似于 ^((?!dolibarr).)*$ 但我无法让它与 traefik 规则一起使用

我正在尝试像我在开始时解释的那样执行规则,因此只有当推荐人来自 some.website.com/dolibarr/(.*) 和重定向与 some.website.com/dolibarr/ 无关 [避免获取 some.website.com/dolibarr/dolibarr/]

【问题讨论】:

    标签: docker-compose rules traefik


    【解决方案1】:

    您正在尝试做的是negative lookahead

    Traefik 是用 Go 编写的,因此使用 Go 的正则表达式,它不支持负前瞻,如 here 所述。您必须以不使用它的方式重写您的正则表达式。

    更新: 实现您正在寻找的一种方法是使用priority 来避免无限循环。还要小心 naem 碰撞,最好使用尾部斜杠:

    labels:
          - "traefik.enable=true"
          - "traefik.backend=dolibarr"
          - "traefik.dolibarr.frontend.rule=Host:${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}; PathPrefixStrip:/${DOLIBARR_PATH}/"
          - "traefik.dolibarr.frontend.priority=100"
          - "traefik.dolibarr_url_fix.frontend.rule=Host:${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}; HeadersRegexp: referer, ^https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/${DOLIBARR_PATH}/"
          - "traefik.dolibarr_url_fix.frontend.priority=50"
          - "traefik.dolibarr_url_fix.frontend.redirect.permanent=true"
          - "traefik.dolibarr_url_fix.frontend.redirect.regex=https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/(.*)"
          - "traefik.dolibarr_url_fix.frontend.redirect.replacement=https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/${DOLIBARR_PATH}/$$1"
          - "traefik.dolibarr_trail_slash_fix.frontend.rule=Host:${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}; Path:/${DOLIBARR_PATH}"
          - "traefik.dolibarr_trail_slash_fix.frontend.priority=10"
          - "traefik.dolibarr_trail_slash_fix.frontend.redirect.permanent=true"
          - "traefik.dolibarr_trail_slash_fix.frontend.redirect.regex=https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/${DOLIBARR_PATH}"
          - "traefik.dolibarr_trail_slash_fix.frontend.redirect.replacement=https://${SUBDOMAIN}.${DOMAIN_NAME}.${DOMAIN_TLD}/${DOLIBARR_PATH}/"
    

    【讨论】:

    • 是否可以在没有负前瞻的情况下实现所要求的内容?如果是,怎么做?
    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 2011-11-08
    相关资源
    最近更新 更多