区分Traefik本身或服务生成的HTTP错误代码



我们在Docker Swarm提供程序上使用Traefik v2.4.7。我们还使用了自定义的错误中间件,它将请求路由到nginx服务器(error-pages@docker服务(。我们在traefik.yml中有以下代码:

http:
middlewares:
error-pages:
errors:
status:
- "400-599"
service: error-pages@docker
query: "/{status}.html"
entrypoints:
web-secure:
address: ":443"
http:
middlewares:
- error-pages@file

我们的应用程序部署在Traefik后面,有一些IP被列入了带有ipwhitelist.sourcerange=...标签的白名单。如果从不允许的IP访问,error-pages中间件将请求路由到nginx服务中的/403.html。这是预期的行为。

然而,在某些情况下,我们的应用程序故意返回403 HTTP状态代码,并显示其自己的";被禁止的";包含支持联系表格、调试信息和其他有用信息的页面。我们不希望Traefik中间件将请求路由到nginx。

是否可以区分Traefik生成的HTTP错误代码和服务本身?如果错误代码是由Traefik生成的,那么它应该通过error-pages中间件。如果错误代码是由服务生成的,那么页面应该按原样返回,而不需要经过中间件。我们如何才能做到这一点?

嗯,我认为这是不可能的(使用内置的errorpages中间件(。。。

  1. 我能想到的唯一解决方案是让客户端应用程序向每个请求发回200(状态代码(,但显示403(Html(页面
  2. 使用自定义插件(中间件(,例如。https://github.com/pierre-verhaeghe/traefik-replace-response-code更改状态代码,例如从应用程序返回493,并在它到达客户端之前将其更改为403

这两种解决方案对我来说都不太好,因为需要更改应用程序行为。。。但也许它已经足够满足你的需求了。

最新更新