Java 如何使HA代理自身跟踪重定向?
我有一个java客户端,它通过HA代理与第三方服务进行对话。第三方服务最近被更改,所以现在它返回302(临时移动)而不是200(确定),这会导致我的java客户端出现故障,因为它预期实际响应为200。出于许多原因,我希望避免对java客户机进行任何代码更改 所以,这里有一个问题:有没有一种方法可以让HA代理自己跟踪重定向,并且只向客户端返回结果(而不是3xx http代码) 还有一件事需要提及:我通过http访问HA代理,HA代理通过https访问第三方资源,并返回302,其中包含https上的位置。位置不同,因此无法将HA代理配置到新位置 HA代理版本:Java 如何使HA代理自身跟踪重定向?,java,http,redirect,web,haproxy,Java,Http,Redirect,Web,Haproxy,我有一个java客户端,它通过HA代理与第三方服务进行对话。第三方服务最近被更改,所以现在它返回302(临时移动)而不是200(确定),这会导致我的java客户端出现故障,因为它预期实际响应为200。出于许多原因,我希望避免对java客户机进行任何代码更改 所以,这里有一个问题:有没有一种方法可以让HA代理自己跟踪重定向,并且只向客户端返回结果(而不是3xx http代码) 还有一件事需要提及:我通过http访问HA代理,HA代理通过https访问第三方资源,并返回302,其中包含https上的
HA代理版本1.7.5 2017/04/03
操作系统:
CentOS Linux 7.2.1511版(核心版)
您似乎试图解决错误的问题
听起来该站点正在返回302
,因为您没有使用HTTPS。因此,将代理配置为使用HTTPS
server foo foo.example.com:443 ssl verify none
您不必使用HTTPS访问代理,但代理需要使用HTTPS发出出站请求
此外,HAProxy不会按照你的要求行事。可以在返回响应时对其进行修改,但不能强制代理遵循重定向。您可以使用此选项
$ 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>
处理重定向。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)
从http.lua下载
谢谢你的回复!Java客户端使用http联系代理,代理使用https联系第三方服务,但第三方服务实际上是将302返回到另一个url,因此,据我所知,代理无法自行处理重定向。如果第三方服务返回重定向,且位置始终相同,只需将代理配置为使用新位置。不,位置不同。什么,它随每个请求而变化?位置URL是根据用户确定的(本例中的用户也是我的java客户端和此第三方服务的用户),因此这些URL将位于不同的子域中,具体取决于此用户为此第三方服务而存在的数据中心。顺便说一句,我已经用我们在这里讨论的内容更新了这个问题,以避免混淆。谢谢你的回复!我会试着回到你身边。有一件事,我怎样才能把它添加到haproxy中?我这里有haproxy/usr/local/sbin/haproxy。我是否需要将http.lua复制到同一位置并在那里创建handle_redirect.lua文件?您可以将haproxy.conf放入同一目录中,还可以确保haproxy通过haproxy-vv启用了lua,否则需要使用lua支持构建haproxy。此外,如果响应大于16K,您可能需要调整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)
haproxy -f haproxy.conf