我设置了一个在端口4000上监听的GraphQL游乐场。
所以我添加了以下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
上侦听。
解决方案1:
使后端应用程序(GraphQL)在路径/graphql
上侦听。
也许您也应该使用PathPrefix(`/graphql`)
而不是Path(`/graphql`)
Solution2:
使用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/。
希望这会有所帮助。