如何让HAProxy自行遵循重定向?

4
我有一个 Java 客户端,通过 HA 代理与第三方服务进行通信。最近第三方服务发生了变化,现在返回 302(暂时移动)而不是 200(正常),这导致我的 Java 客户端失败,因为它期望实际响应为 200。出于许多原因,我希望避免对 Java 客户端进行任何代码更改。
因此,问题是:是否有一种方法可以使 HA 代理自己跟随重定向,并仅将结果(而非 3xx http 代码)返回给客户端?
还有一件事需要提到:我通过 http 访问 HA 代理,HA 代理通过 https 访问第三方资源并返回带有 https 的 location 的 302。位置不同,因此配置 HA 代理到新位置不是一个选项。
HA Proxy 版本:HA-Proxy version 1.7.5 2017/04/03 操作系统:CentOS Linux release 7.2.1511 (Core)
2个回答

10
您可以使用此。
$ haproxy -v
Nuster version 1.8.8.2.2
Copyright (C) 2017-2018, Jiang Wenyuan, <koubunen AT gmail DOT com >

HA-Proxy version 1.8.8.2 2018/05/29
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>

haproxy.conf

global
    debug
    lua-load handle_redirect.lua

frontend web1
    bind *:8080
    mode http

    default_backend app1

backend app1
    mode http

    http-response lua.handle_redirect if { status eq 301 }

    server s1 127.0.0.1:9000

handle_redirect.lua

http = require("http")

core.register_action("handle_redirect", {"http-res"}, function(txn)

  local hdr = txn.http:res_get_headers()
  if hdr["location"] == nil then
    return nil
  end


  local r, msg = http.get{
    url = hdr["location"][0]
  }

  if r == nil then
    return msg
  end

  local res = "HTTP/1.1 " .. r.status_code .. " " .. r.reason .. "\r\n"
  for k, v in pairs(r.headers) do
    res = res .. k .. ": " .. v .. "\r\n"
  end
  res = res .. "\r\n"
  res = res .. r.content


  txn.res:set(res)
  txn.done(txn)

end)

https://github.com/haproxytech/haproxy-lua-http/blob/master/http.lua下载http.lua

haproxy -f haproxy.conf

谢谢您的回复!我会尝试并回来找您。 - Sergei Sirik
有一个问题,我该如何将它添加到haproxy中?我在这里有haproxy /usr/local/sbin/haproxy。我需要将http.lua复制到相同的位置并在那里创建handle_redirect.lua文件吗? - Sergei Sirik
1
你可以将以下内容放在与haproxy.conf相同的目录中,同时确保haproxy已启用lua,通过haproxy -vv命令进行检查,否则需要使用lua支持构建haproxy。此外,如果响应大于16K,则可能需要调整lua文件。 - nuster cache server
http.lua 还需要 json 模块,可以通过在 Ubuntu 20.04 中安装 lua-json 来完成安装。 - Benjamin

1
似乎你正在尝试解决错误的问题。
听起来该网站返回了302状态码,原因是你没有使用HTTPS。因此,请配置代理以使用HTTPS。
server foo foo.example.com:443 ssl verify none

你不必使用HTTPS访问代理,但代理需要使用HTTPS发出出站请求。
此外,HAProxy无法完成您所要求的操作。响应可以在返回时进行修改,但您无法强制代理遵循重定向。

谢谢您的回复!Java客户端使用http与代理服务器通信,代理服务器使用https与第三方服务进行通信,但实际上第三方服务返回302到另一个URL,因此我理解代理服务器无法自行处理重定向。 - Sergei Sirik
如果第三方服务返回重定向,并且位置始终相同,只需配置代理以使用新位置。 - Michael - sqlbot
它会随着每个请求而改变? - Michael - sqlbot
位置URL是根据用户(在这种情况下,用户是我的Java客户端和第三方服务的用户)确定的,因此这些URL将基于此用户在此第三方服务中存在的数据中心而位于不同的子域中。顺便说一句,我已经更新了问题,以避免混淆。 - Sergei Sirik
谢谢你的帮助!我可以为不同的用户找出URL,但我想避免对我的Java客户端进行代码更改。看起来代码更改是我唯一的选择。 - Sergei Sirik
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接