Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使HA代理自身跟踪重定向?_Java_Http_Redirect_Web_Haproxy - Fatal编程技术网

Java 如何使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上的

我有一个java客户端,它通过HA代理与第三方服务进行对话。第三方服务最近被更改,所以现在它返回302(临时移动)而不是200(确定),这会导致我的java客户端出现故障,因为它预期实际响应为200。出于许多原因,我希望避免对java客户机进行任何代码更改

所以,这里有一个问题:有没有一种方法可以让HA代理自己跟踪重定向,并且只向客户端返回结果(而不是3xx http代码)

还有一件事需要提及:我通过http访问HA代理,HA代理通过https访问第三方资源,并返回302,其中包含https上的位置。位置不同,因此无法将HA代理配置到新位置

HA代理版本:
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