我有一个配置为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
答案 0 :(得分:0)
嗯,很难使用HAProxy修改http响应的正文,因此您可能需要尝试以下替代方法之一:
如果可以直接使用CloudFront代替S3存储桶,则可以configure CloudFront返回自定义404错误页面。
如果您可以将反向代理切换到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。