【问题标题】:In Haproxy how do I forward to a custom 404 page but still return a 404 status code?在 Haproxy 中,如何转发到自定义 404 页面但仍返回 404 状态码?
【发布时间】:2019-11-27 18:59:21
【问题描述】:

我有一个配置为 S3 的 haproxy 默认后端,它保存静态文件。 我的问题是......如果路由通过默认后端然后找不到我想要捕获该 404 并显示我自己的自定义 404 页面的资源(它也在同一个 S3 后端位置)但是仍然返回 404 状态。 到目前为止我有这个,但它依赖于重定向 302,这是返回给浏览器的状态,我想要一个 404(/404.html 是我的自定义“未找到”页面);

backend static_s3
  errorfile 503 /etc/haproxy/errors/index.html  
  http-response set-header Location /404.html if { status eq 404 }
  http-response set-status 302 if { status eq 404 }
...

所以我想查看我的自定义“未找到”页面,但浏览器将其识别为 404 状态代码,可以这样做吗?

附言如果 Haproxy 允许你在后端部分做这样的事情就好了;

errorfile 404 /etc/haproxy/errors/404/index.html

【问题讨论】:

    标签: haproxy


    【解决方案1】:

    嗯,使用 HAProxy 修改 http 响应的正文很困难,因此您可能想尝试以下替代方法之一:

    1. 如果您可以直接使用 CloudFront 而不是您的 S3 存储桶,您可以 configure CloudFront 返回自定义 404 错误页面。

    2. 如果您可以将反向代理切换到 nginx,则可以使用 error_page 指令轻松设置错误页面

    如果这些替代方案都不适合您,您可以使用 Lua 在内部进行重定向。这是一个堆栈溢出答案,概述了如何执行this

    【讨论】:

    • ty ... 是的,我可以使用 CloudFront,所以如果我创建一个新的“默认后端”(针对我所有未知/未捕获的路由)并将这些路由发送到新的 CloudFront 404 页面,将如何返回 404 状态而不是 200? nginx - 不是一个选项 Lua - 是的,阅读了一些关于此的内容,但看起来像是一些我还没有准备好的活动部件......可能是计划 #c 或 #d tho :)
    • 抱歉应该已经阅读了 CloudFront (CF) 链接...所以我创建了一个新的 CF 位置,将我的默认后端指向该新位置,设置我的新 CF 位置并使用以下规则如果在我的新 CF 位置上找不到资源并返回 404 状态,请显示我的自定义 404 页面?
    • @Billy 如果您计划使用 CloudFront,您可以在 CloudFront 上设置错误页面。对于 404,将状态码设置为 404 并在错误页面文档中选择要加载的页面。记得在错误页面中选择状态码 404。
    • 我已经解决了这个问题,它的工作原理,非常感谢你们俩:)
    【解决方案2】:

    您可以执行以下操作,这将在返回 404 状态代码而不是 302 重定向时显示您的 404。

    1) 将您的默认后端设置为 404 后端。

    default_backend static_404
    

    2) 定义您的 404 后端。

    backend static_404
      errorfile 503 /etc/haproxy/errors/index.html  
      reqirep ^Host:\ (.*) Host:\ yourbucketwiththe404.s3-eu-west-1.amazonaws.com
      reqirep ^(.*\ /)(.*)$ \1404.html
      http-response set-status 404
      server static-404 yourbucketwiththe404.s3-eu-west-1.amazonaws.com:80 check
    

    您可能希望在reqireps 中添加条件,以防止在加载 404 资产(即脚本和样式表)时执行它们,否则它们也会抛出 404。

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 2011-11-22
      • 2018-04-05
      • 2021-06-09
      • 2011-01-19
      • 1970-01-01
      • 2018-10-20
      • 2012-04-24
      相关资源
      最近更新 更多