V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RRyo
V2EX  ›  问与答

Traefik 有无对应 NGINX error_page 497 的配置?

  •  
  •   RRyo · 2022-03-31 21:09:18 +08:00 · 993 次点击
    这是一个创建于 748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    2.6.x 版本 k8s/k3s 环境部署

    entrypoint 启用 tls 提供 https 服务,在该 entrypoint 端口收到 http 请求时,本来预计应该得到一个类似 nginx 的 http code = 497 的错误,结果实测结果是 404 ,尝试加 middleware 正则匹配修改 /重定向均无效,原因似乎是在匹配 router 的时候这个 entrypoint 下匹配 schema 永远都是 http!=https 所以请求无法命中任何一条 router 配置,更后面的中间件也就自然无效了,直接在 traefik 启动 cli 里给 entrypoint 加默认中间件同样未执行

    这就有点坑爹了,在 IngressRoute 里试了好几种 match 规则也不能匹配到这种乱入 https 端口的 http 流量

    说实话就算 497 不是 RFC 定义,那我已经配置了符合 HOST 条件的 router ,讲道理也应该是被 router 命中后返回 400 吧,现在没有 router 能命中永远返回个 404 ,也没法配置处理这个异常也太难顶了 nginx 里一句 error_page 497 https://$host:$server_port$uri$is_args$args;

    能搞定的事情,琢磨了半天也不知道在 traefik 上咋整,向各位 dalao 求教,这问题除了在 traefik 前面加一层 nginx 帮它把这个活儿干了之外有没有什么能直接通过 traefik 解决的方式?

    第 1 条附言  ·  2022-04-01 15:26:43 +08:00
    已找到解决方法
    需要不开启 entrypoints 的全局 tls ,然后添加如下两条配置
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
    name: http2https
    spec:
    redirectRegex:
    regex: ^http://(.*)
    replacement: https://${1}
    permanent: true

    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
    name: http2https
    spec:
    routes:
    - match: HostRegexp(`{host:.+}`)
    kind: Rule
    priority: 1
    middlewares:
    - name: http2https
    services:
    - name: noop@internal
    kind: TraefikService

    再给其他所有 ingressroute 显式添加 tls 配置,就可以做到单个 entrypoints 下 http 请求被拦截处理了
    问题的原因出在启动时 entrypoints 全局添加的 tls 规则会追加到动态发现的 ingressroute 中,而 ingressroute 没有类似
    tls:
    enable: false
    的配置能在不起用 tls 的前提下拒绝全局配置的方法,所以才会一直无法命中
    每一条 ingressroute 都要加 tls 配置代价还是有点重的,蹲一个后续更新
    2 条回复    2022-04-01 10:53:46 +08:00
    aragakiyuii
        1
    aragakiyuii  
       2022-03-31 22:02:43 +08:00
    再配一个 80 端口的 entryPoints 应该可以把
    RRyo
        2
    RRyo  
    OP
       2022-04-01 10:53:46 +08:00
    @aragakiyuii 开个 80 的其实是利用自动给 http+80 https+443 把这部分分离了,但非标准端口就没法解决(比如 8443 )
    实际遇到的问题是家里一套环境通过 traefik 统一管理对外暴露+SSL 变 https ,(集群)内部走 http ,有部分应用在重定向跳转的时候没有读取客户端到 traefik 这一段走的 https ,返回的仍然是 http 的跳转 /文件 url ,这样就有 http 请求被发送到 https 的 entrypoints 上了,在很久以前用 nginx 做网关的时候遇到这个问题就是用 error_page 497 直接把请求改跳到对应的 https 上,现在用 traefik 因为 router 的匹配机制现在就尬住了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5373 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 05:45 · PVG 13:45 · LAX 22:45 · JFK 01:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.