在Haproxy中,我如何转发到自定义404页面,但仍返回404状态代码?

时间:2019-03-28 12:45:09

标签: haproxy

我有一个配置为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状态代码,可以吗?

p.s。如果Haproxy允许您在后端部分中执行类似的操作,那将会很好;

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

2 个答案:

答案 0 :(得分:0)

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

  1. 如果可以直接使用CloudFront代替S3存储桶,则可以configure CloudFront返回自定义404错误页面。

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

如果这两种选择都不适合您,则可以使用Lua在内部进行重定向。这是一个堆栈溢出答案,概述了如何进行this

答案 1 :(得分:0)

您可以执行以下操作,在返回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。