Traefik 2.0 - 路径路由器规则不适用于 docker 标签

Traefik 2.0 - Path router rule not working with docker labels

我设置了一个监听端口 4000 的 GraphQL playground。

所以我添加了以下 Traefik 标签:

graphql:
  restart: unless-stopped
  labels:
    - traefik.enable=true
    - "traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.rule=Host(`graphql.${CI_ENVIRONMENT_HOST}`)"
    - traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.tls.certresolver=letsencrypt
    - traefik.http.services.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.loadbalancer.server.port=4000

这在我尝试获取 graphql.site.com 时有效。

现在我希望它匹配 site.com/graphql,所以我将路由器标签更改为:

"traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.rule=Host(`${CI_ENVIRONMENT_HOST}`) && Path(`/graphql`)"

使用此配置,我在 site.com/graphql 上出现 404 错误。

我错过了什么?

在我看来,没有后端应用程序在路径 /graphql 上侦听。

解决方案一:

使后端应用程序 (GraphQL) 侦听路径 /graphql

也许你还应该使用 PathPrefix(`/graphql`) 而不是 Path(`/graphql`)

解决方案2:

使用 traefik StripPrefix在转发请求.

之前从路径中删除前缀

使用这些标签。:

- "traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.rule=Host(`${CI_ENVIRONMENT_HOST}`)"
- "traefik.http.middlewares.stripprefix-graphql.stripprefix.prefixes=/graphql"
- "traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.middlewares=stripprefix-graphql@docker"

如果后端正在提供资产(例如图像或 Javascript 文件),您需要对后端进行额外的更改: 更多信息在这里:https://docs.traefik.io/middlewares/stripprefix/.

希望对您有所帮助。

Path('') 是如何工作的?

(traefik 文档没有解释)

我想创建一个 traefik 入口规则来查找主机名中的子字符串,例如我想在所有 3 个示例中匹配 api

mysite.com/subroute1/api/get
mysite.com/subroute2/api/post
mysite.com/subroute2/api/post

PathPrefix 将不起作用,因为 subroute1、subroute2 和 subroute3 的前缀不同。

我可以使用 Path('/api')吗,它适用于所有 3 个子路线吗? (或者没有类似 PathContains('/api') 的东西)?