正则表达式如何匹配不包含固定字符串的子字符串。 Traefik 中的正则表达式

Regex how to match a substring that does not contain a fixed string. Regex in Traefik

我在同一个页面 (some.website.com) 中有几个容器 运行 与 traefik 和 docker-compose,我试图制定一个规则来转发每个请求仅当重定向没有子域时,才会从某个子域引荐到同一子域。

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

我已经用 traefik 规则解决了这个问题,所以它会将我发送到: some.website.com/dolibarr/answer.php?随便 但是还有其他几个子页面将我发送到 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}/$"


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

我正在尝试按照我在开始时解释的那样制定规则,因此只有当 referer 来自 some.website.[= 时,它才会将我发送到 some.website.com/dolibarr/ 23=]/(.*) 并且重定向与 some.website.com/dolibarr/ 无关 [以避免获得 some.website.com/dolibarr/dolibarr/]

您要做的是 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}/$"
      - "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}/"