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') 的东西)?
我设置了一个监听端口 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') 的东西)?