我设置了一个在端口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错误。
我想念什么?
答案 0 :(得分:1)
我认为没有后端应用程序在路径/graphql
上监听。
解决方案1:
使后端应用程序(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/。
希望这会有所帮助。