如何在 spring 云网关中将 HTTP 重定向到 HTTPS

How to redirect HTTP to HTTPS in spring cloud gateway

如何将 http 调用重定向到 spring-cloud-gateway 中的 https。我已经按照 This Link 中的描述在我的网关项目中配置了 https。

现在 HTTPS url 工作正常,但另外我需要将所有 http 调用重定向到 https。我试过了

但这对我不起作用,因为我没有使用默认 http 端口 8080,而且我的应用程序 运行 spring 安全。

以下代码展示了如何将 http 重定向到 https,但我需要对 Netty 服务器进行相同的配置,因为 spring-cloud-gateway 仅支持 netty。

@Configuration
public class RedirectToHttpsConfig {

    @Value("${server.port}")
    private Integer httpsPort;

    @Value("${server.http.port}")
    private Integer httpPort;

    /* ################ THIS WILL WORK FINE ################ 
       ################ IF YOU HAVE TOMCAT  ################ 
       ################ AS EMBEDDED SERVER  ################ 
   */
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("*//*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
        return tomcat;
    }

    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(httpPort);
        connector.setSecure(false);
        connector.setRedirectPort(httpsPort);
        return connector;
    }

    /* ################ -------- ################ */


    /* ################ HOW TO DO THE ABOVE Configuration
       FOR NETTY SERVER ################ */
    @Bean
    public NettyReactiveWebServerFactory nettyReactiveWebServerFactory(){
        NettyReactiveWebServerFactory netty = nettyReactiveWebServerFactory(){
            NettyServerCustomizer  nettyServerCustomizer = new NettyServerCustomizer() {
                @Override
                public void customize(HttpServerOptions.Builder builder) {
                    **// NOT ABLE TO FIGURE OUT HERE**
                }
            }
        };
    }


}

执行此操作的最佳方法是在您的网关前面放置一个 apache,并对其设置重写规则。 运行这种方式有很多好处。它还使您拥有最终用户可以点击的静态 url,如果您遇到问题或更改 apache 背后的基础技术,您可以将其指向新的 service/url 或其他任何内容。在 Apache 上执行此操作还允许您 运行 诸如 mod 之类的安全性。最终它可能只是一个直通(对你的 http->https 问题有一个重写规则)但这比在你的网关中用代码做它更好的架构。