为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 2 个反向代理链后面强制主机名

如何在 2 个反向代理链后面强制主机名

小唯快跑啊 2023-03-02 15:05:23
一个 spring boot 应用程序托管在 2 个反向代理(链接)后面。反向代理 1 --> 反向代理 2 --> spring boot 应用程序并且主机和转发标头未正确链接。有没有办法强制主机为固定值?像“反向代理 1”的主机名?
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我已通过更改传入请求中的服务器名称解决了我的问题。


我已经为 tomcat 添加了一个阀门:


public class HostForceValve extends ValveBase {


private final String proxyName;


public HostForceValve(String proxyName) {

    this.proxyName = proxyName;

}


@Override public void invoke(Request request, Response response) throws IOException, ServletException {

    org.apache.coyote.Request coyoteRequest = request.getCoyoteRequest();

    MimeHeaders mimeHeaders = coyoteRequest.getMimeHeaders();

    mimeHeaders.removeHeader("host");

    final MessageBytes host = mimeHeaders.addValue("host");

    host.setString(proxyName);

    request.setRemoteHost(proxyName);

    request.getCoyoteRequest().serverName().setString(proxyName);

    try {

        Valve next = getNext();

        if (null == next) {

            return;

        }

        next.invoke(request, response);

    } finally {

        request.setRemoteHost(proxyName);

    }


}

}

并将此值添加到 tomcat 嵌入式服务器:


@Component

public class MyTomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {


@Value("${proxyName:}")

private String proxyName;


@Override

public void customize(TomcatServletWebServerFactory factory) {

    final Collection<Valve> currents = factory.getEngineValves();

    final ArrayList<Valve> addValves = new ArrayList<>(currents);

    if (StringUtils.hasLength(proxyName)) {

        addValves.add(0, new HostForceValve(proxyName));

    }

    factory.setEngineValves(addValves);

}

}


查看完整回答
反对 回复 2023-03-02
  • 1 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信