Docker环境下Traefik代理Geoserver实现根域名访问的路径配置问题
问题原因
你配置的中间件未生效的核心问题是:仅定义了中间件规则,没有将中间件绑定到对应的Traefik路由器上,因此规则不会被触发。
以下是两种可行的实现方案:
方案1:修正Traefik中间件配置
使用addPrefix中间件即可完成路径前缀拼接,无需使用更复杂的replacepathregex,修改geoserver服务的labels配置如下:
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-addprefix.addprefix.prefix=/geoserver # 将中间件绑定到对应路由器,@docker表示中间件来源是docker标签 - traefik.http.routers.geoserver.middlewares=geoserver-addprefix@docker
注意:该方案仅修改了转发到Geoserver的请求路径,Geoserver内部生成的页面链接、资源路径默认仍会携带/geoserver前缀,可能出现跳转后路径带前缀、静态资源加载失败的问题。
方案2:修改Geoserver上下文路径为根路径(更推荐)
直接修改Geoserver本身的服务根路径,不需要Traefik做任何路径重写,从根源避免路径匹配问题。你使用的oscarfonts/geoserver镜像支持通过环境变量调整上下文路径,完整配置如下:
geoserver: image: oscarfonts/geoserver:latest restart: unless-stopped networks: - web environment: # 将Geoserver上下文根路径设为/ - GEOSERVER_CONTEXT_ROOT=/ 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
该方案下Geoserver内部生成的所有链接、资源路径都默认使用根路径,不会出现路径异常问题,配置也更简洁。
内容的提问来源于stack exchange,提问作者kaveh
相关产品推荐
相关产品推荐

