首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Treafik addPrefix/replacePathRegex

Treafik addPrefix/replacePathRegex
EN

Stack Overflow用户
提问于 2021-08-20 20:17:03
回答 2查看 1.3K关注 0票数 0

我正试着和码头建立geoserver和traefik,但是在路径上有问题。

Geoserver的主要入口点在/geoserver,但我希望在域的根路径上访问它,比如example.com。下面是我放在一起的docker-compose文件:

代码语言:javascript
复制
version: "3"

services:
  traefik:
    image: traefik:2.4
    restart: unless-stopped
    networks:
      - web
    ports:
      - 80:80
      - 443:443
    command:
      - --log.level=DEBUG
      - --providers=docker
      - --providers.docker.network=geoserver_web
      - --entrypoints.websecure.address=:443
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=websecure
      # - --api.dashboard=true
      - --certificatesresolvers.lets-encrypt.acme.email=admin@example.com
      - --certificatesresolvers.lets-encrypt.acme.storage=acme.json
      - --certificatesresolvers.lets-encrypt.acme.tlschallenge=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
  
  geoserver:
    image: oscarfonts/geoserver:latest
    restart: unless-stopped
    networks:
      - web
    labels:
      - traefik.port=8080
      - traefik.http.routers.geoserver.rule=Host(`example.com`)
      - traefik.http.routers.geoserver.entrypoints=websecure
      - traefik.http.routers.geoserver.tls=true
      - traefik.http.routers.geoserver.tls.certresolver=lets-encrypt
      - traefik.http.middlewares.geoserver.replacepathregex.regex=(.*)
      - traefik.http.middlewares.geoserver.replacepathregex.replacement=/geoserver/$$1

networks:
  web:

在浏览了traefik文档之后,我认为在geoserver服务上使用replacepathregex应该在传递给geoserver的所有请求的路径上优先使用/geoserver,并且应该使服务在example.com上可用,而不是example.com/geoserver,但是它没有工作。

我也尝试过addPrefix,但这也不起作用。

配置不正确吗?还是我对那些中间人的理解?是否有一种方法可以将我的服务配置为可在example.com访问,而不是example.com/geoserver

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-23 18:04:32

原来问题是我的traefik配置!我需要将中间件添加到geoserver路由器。下面是更新的docker-compose.yml (我使用的是addprefix而不是replacepathregex,因为后者太过了):

代码语言:javascript
复制
version: "3"

services:
  traefik:
    image: traefik:2.4
    restart: unless-stopped
    networks:
      - web
    ports:
      - 80:80
      - 443:443
    command:
      - --log.level=DEBUG
      - --providers=docker
      - --providers.docker.network=geoserver_web
      - --entrypoints.websecure.address=:443
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=websecure
      # - --api.dashboard=true
      - --certificatesresolvers.lets-encrypt.acme.email=admin@example.com
      - --certificatesresolvers.lets-encrypt.acme.storage=acme.json
      - --certificatesresolvers.lets-encrypt.acme.tlschallenge=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
  
  geoserver:
    image: oscarfonts/geoserver:latest
    restart: unless-stopped
    networks:
      - web
    labels:
      - traefik.http.middlewares.add-geoserver-prefix.addprefix.prefix=/geoserver
      - traefik.port=8080
      - traefik.http.routers.geoserver.rule=Host(`example.com`)
      - traefik.http.routers.geoserver.entrypoints=websecure
      - traefik.http.routers.geoserver.tls=true
      - traefik.http.routers.geoserver.tls.certresolver=lets-encrypt
      - traefik.http.routers.geoserver.middlewares=add-geoserver-prefix@docker

networks:
  web:
代码语言:javascript
复制
票数 0
EN

Stack Overflow用户

发布于 2021-08-21 02:09:23

关于ReplacePathRegex:配置示例,Docker选项卡,它提到如下示例:

代码语言:javascript
复制
# Replace path with regex
labels:
  - "traefik.http.middlewares.test-replacepathregex.replacepathregex.regex=^/foo/(.*)"
  - "traefik.http.middlewares.test-replacepathregex.replacepathregex.replacement=/bar/$$1"

连同以下引文

正则表达式和替换可以使用在线工具(如围棋游乐场Regex101 )进行测试。

我使用Regex101来测试和确保上面的样例配置,并进行扩展,这样我们就可以实现我们的需求,如下所示。

测试用例1

  • 正则表达式:/foo/(.*) (注:这里没有前导插入符号^ )
  • 测试字符串:https://my.domain.com/foo/api
  • 替代:/bar/$1 (注:这里有一美元唱$,请稍后解释)
  • 结果:https://my.domain.com/bar/api

测试用例2

  • 正则表达式:/foo/(.*)
  • 测试字符串:https://my.domain.com/foo/api
  • 替代:/$1
  • 结果:https://my.domain.com/api

测试用例3: geoserver第1轮

  • 正则表达式:(.*)/(.*)
  • 测试字符串:https://my.domain.com/api
  • 替代:$1/geoserver/$2
  • 结果:https://my.domain.com/geoserver/api

测试用例4: geoserver第2轮

  • 正则表达式:(.*)/(.*)
  • 测试字符串:https://my.domain.com/api
  • 替代:/geoserver/$2
  • 结果:/geoserver/api

侧边栏1:为什么我们需要双元唱歌($$)?

因为docker-compose$VARIABLE${VARIABLE}的形式提供变量替换,所以美元符号是一个key word / reserved word,我们必须避开它,使我们在docker-compose.yml中使用美元歌唱($$)。详情请参阅StackOverflow 问题回答

侧栏2:前导插入符(^)

经过一段时间的试验和错误之后,我意识到有一点不同,因为Traefik需要前导插入符,而Regex101不需要。到目前为止,我仍然不知道为什么是这样,我记得是这样的:

总结

要通过遵循测试用例4实现我们的需求,docker-compose标签应该如下所示

代码语言:javascript
复制
labels:
  - traefik.http.middlewares.geoserver.replacepathregex.regex=^(.*)/(.*) # <-- the leading caret
  - traefik.http.middlewares.geoserver.replacepathregex.replacement=/geoserver/$$2

编辑1

测试用例5: geoserver第3轮

  • 正则表达式:^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?/(.*)$
  • 测试字符串:https://my.domain.com/path
代码语言:javascript
复制
- Substitution: `/geoserver/$4`
- The result: `/geoserver/path`
  • 测试字符串:https://my.domain.com/path/to
代码语言:javascript
复制
- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to`
  • 测试字符串:https://my.domain.com/path/to/api
代码语言:javascript
复制
- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to/api`
  • 测试字符串:https://my.domain.com/path/to/api?key=value
代码语言:javascript
复制
- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to/api?key=value`
  • 测试字符串:https://my.domain.com/path/to/api?key=value&anotherkey=anothervalue
代码语言:javascript
复制
- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to/api?key=value&anotherkey=anothervalue`

总结

为了实现我们的需求,应该遵循测试用例5,docker-compose标签,如下所示

代码语言:javascript
复制
labels:
  - traefik.http.middlewares.geoserver.replacepathregex.regex=^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?/(.*)$$ # <-- the leading caret and double dollar sign at the end
  - traefik.http.middlewares.geoserver.replacepathregex.replacement=/geoserver/$$4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68867660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档