【问题标题】:Redirect to a different host in Spring Boot (non-www to www URL)重定向到 Spring Boot 中的不同主机(非 www 到 www URL)
【发布时间】:2019-08-20 00:48:14
【问题描述】:

我已为我的项目配置了自签名证书,并已配置为将不安全的 http 重定向到 https。我还想将一个请求重定向到一个没有“www.”前缀的主机到一个没有“www.”前缀的主机,比如当我们向https://google.com发出请求时,它会自动重定向到https://www.google.com

现在,为了做到这一点,我找到了一个名为 UrlRewriteFilter 的库,但该库具有 XML 中可用的配置。我试图将 XML 配置转换为 java 等效配置,但我没有运气,因为我找不到 java 等效方法。我尝试通过参考this Baeldung resource 来转换配置。下面是基于 XML 的配置。我正在使用带有嵌入式 undertow 服务器的 Spring Boot 1.5.19。请帮忙。

Maven 依赖:

<dependency>
  <groupId>org.tuckey</groupId>
  <artifactId>urlrewritefilter</artifactId>
  <version>4.0.4</version>
</dependency>

web.xml

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>UrlRewriteFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>

urlrewrite.xml

<urlrewrite>
  <rule>
    <name>seo redirect</name>
    <condition name="host" operator="notequal">^www.csetutorials.com</condition>
    <from>^/(.*)</from>
    <to type="permanent-redirect" last="true">http://www.csetutorials.com/$1</to>
  </rule>
</urlrewrite>

【问题讨论】:

  • 为什么不用redirect:www 添加一个映射到非 WWW 的控制器?这个库不是必需的——它真的是为使用原始 servlet 的人设计的。
  • 只是出于好奇 - 如果您希望执行从裸域到 www 的重定向,为什么不在 Web 服务器级别执行呢?
  • @CuriousMind 这可以使用 bean 完成吗?我正在使用 Embedded Undertow 服务器。

标签: java spring-boot undertow tuckey-urlrewrite-filter


【解决方案1】:

我必须在这里回答我自己的问题,因为我发现这个库没有 Java 等效配置,因为它最后一次维护是在 2012 年。解决方案是 Java 和 XML 配置的混合。如果您使用反向代理服务器,则可以避免此配置。但是,我想避免这种情况,并让单个应用程序服务器来做各种事情。就这样吧:

配置文件:

@Configuration
public class UrlRewriteConfig extends UrlRewriteFilter {

    private UrlRewriter urlRewriter;

    @Bean
    public FilterRegistrationBean tuckeyRegistrationBean() {
        final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new UrlRewriteConfig());
        return registrationBean;
    }

    @Override
    public void loadUrlRewriter(FilterConfig filterConfig) throws ServletException {
        try {
            ClassPathResource classPathResource = new ClassPathResource("urlrewrite.xml");
            InputStream inputStream = classPathResource.getInputStream();
            Conf conf1 = new Conf(filterConfig.getServletContext(), inputStream, "urlrewrite.xml", "");
            urlRewriter = new UrlRewriter(conf1);
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

    @Override
    public UrlRewriter getUrlRewriter(ServletRequest request, ServletResponse response, FilterChain chain) {
        return urlRewriter;
    }

    @Override
    public void destroyUrlRewriter() {
        if (urlRewriter != null)
            urlRewriter.destroy();
    }
}

项目结构:

还有 urlrewrite.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite
        PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
        "http://www.tuckey.org/res/dtds/urlrewrite3.0.dtd">

<urlrewrite>
    <rule>
        <name>SEO Redirect and Secure Channel</name>
        <condition name="host" operator="equal">^example.com</condition>
        <from>^(.*)$</from>
        <to type="permanent-redirect">https://www.example.com$1</to>
    </rule>
</urlrewrite>

非常重要的一点需要注意,我必须在 Undertow 服务器配置中删除我不安全的 http 到 https 重定向,因为它引发了错误 - “重定向太多”。所以我所做的是我保持打开两个端口 - 80 和 443 用于不安全和安全的连接,并且 tukey 配置执行各种重定向,从 http 到 https 以及从非 www 到 www。希望对你有帮助。

【讨论】:

  • 太好了,你为我节省了很多时间。
猜你喜欢
  • 2011-06-24
  • 2019-03-09
  • 2011-11-05
  • 2013-12-20
  • 2012-12-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多