我正在尝试使用 nginx 来提供使用错误页面中间件的自定义错误页面,以便可以使用自定义错误页面处理对lambda 服务(我无法控制)的 404 请求。我希望能够在该错误页面上获取此原始请求的上下文,无论是在 Nginx 中用于进一步转发,还是作为用于进一步处理的标头,例如在 PHP 或诸如此类的内容中,以便我可以在 404 页面上提供上下文链接。
但是,现在在 Traefik 的 ErrorPage 中间件中重定向到 Nginx 之后,请求似乎丢失了原始服务查询中的所有标头和数据。
我的 dockerfile 的相关部分:
traefik.port=8080
traefik.protocol=http
traefik.docker.network=proxy
traefik.frontend.rule=PathPrefix:/myservice;ReplacePathRegex:^/myservice/(.*) /newprefix/$$1
traefik.frontend.errors.myservice.status=404
traefik.frontend.errors.myservice.service=nginx
traefik.frontend.errors.myservice.query=/myservice-{status}
Run Code Online (Sandbox Code Playgroud)
Nginx 收到转发的 404 请求,但请求 URI 只是/myservice-404查询中指定的路径(或者/,如果我省略了traefik.frontend.errors.myservice.query)。在 ReplacePathRegex 之后,我在标头中获得了原始请求的路径HTTP_X_REPLACED_PATH,但是在任何标头中都不再可以访问任何查询参数,并且 nginx 看不到有关原始 URI 的任何其他信息。例如,如果我请求mysite.com/myservice/some/subpath?with=parameters,HTTP_X_REPLACED_PATH标题将显示/myservice/some/subpath但不包括参数。
Traefik 是否可以将有关原始请求的完整上下文传递给另一个服务?
我真正想要的是try_files,在那里我可以说“如果这个 traefik 请求失败,请尝试其他路径”,但我会满足于能够在处理后端服务器中访问原始的完整请求参数. 如果有一种方法可以使用 Traefik 收到的完整路径和查询向 Nginx 发送请求,那将是理想的。
tl;博士:
不幸的是,这对于 Traefik 来说是不可能的。我试图实现类似的目标,但我意识到我们能够传递到错误页面的唯一信息是 HTTP 代码,仅此而已。
他们的文档中提到了唯一可用的选项:https ://doc.traefik.io/traefik/middlewares/errorpages/