404重定向到另一个服务器/域

时间:2017-10-06 15:31:20

标签: haproxy

如果来自HTTP服务器的响应为404,我正在寻找重定向到另一个域的解决方案。

acl not_found status 404
acl found_ceph status 200
use_backend minio_s3 rsprep ^HTTP/1.1\ 404\ (.*)$ HTTP/1.1\ 302\ Found\nLocation:\ / if not_found
use_backend ceph if found_ceph

但仍然无效,此规则将转至minio_s3后端。

谢谢你的建议。

1 个答案:

答案 0 :(得分:0)

当此后端的响应状态为404时,首先添加Location标头,将浏览器发送到原始URI完整的example.com,然后将状态代码设置为302,以便浏览器执行重定向。

backend my-backend
    mode http
    server my-server 203.0.113.113:80 check inter 60000 rise 1 fall 2
    http-response set-header Location http://example.com%[capture.req.uri] if { status eq 404 }
    http-response set-status 302 if { status eq 404 }

测试:

$ curl -v http://example.org/pics/funny/cat.jpg
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to example.org (127.0.0.1) port 80 (#0)
> GET /pics/funny/cat.jpg HTTP/1.1
> User-Agent: curl/7.35.0
> Host: example.org
> Accept: */*

实际的后端会返回404,但我们看不到它。代替...

< HTTP/1.1 302 Moved Temporarily
< Last-Modified: Thu, 04 Aug 2016 16:59:51 GMT
< Content-Type: text/html
< Content-Length: 332
< Date: Sat, 07 Oct 2017 00:03:22 GMT
< Location: http://example.com/pics/funny/cat.jpg

来自后端404错误页面的响应正文仍然会被发送到浏览器,但是 - 事实证明 - 浏览器不会显示它,所以不会造成任何伤害。这需要HAProxy 1.6或更高版本。