Перенаправление на другой хост в Spring Boot (URL-адрес без www на www)

Я настроил свой проект с самозаверяющим сертификатом и настроил перенаправление небезопасного http на https. Я также хочу перенаправить запрос на хост без префикса "www." на хост, у которого он есть, например, когда мы отправляем запрос на https://google.com автоматически перенаправляется на https://www.google.com.

Теперь, чтобы сделать это, я нашел библиотеку под названием UrlRewriteFilter, но конфигурация этой библиотеки доступна в формате XML. . Я попытался преобразовать конфигурацию XML в эквивалентную Java, но мне не повезло, так как я не смог найти методы, эквивалентные Java. Я попытался преобразовать конфигурацию, взяв ссылку из этого ресурса Baeldung. Ниже приведена конфигурация на основе XML. Я использую Spring Boot 1.5.19 со встроенным сервером undertow. Пожалуйста помоги.

Зависимость Мавена:

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

веб.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>

person sam    schedule 29.03.2019    source источник
comment
Почему бы просто не добавить контроллер, привязанный к не WWW с помощью redirect:www? Библиотека не нужна - она ​​действительно предназначена для людей, использующих необработанные сервлеты.   -  person Boris the Spider    schedule 29.03.2019
comment
Просто из любопытства. Если вы хотите выполнить перенаправление с голого домена на www, почему бы не сделать это на уровне веб-сервера?   -  person CuriousMind    schedule 29.03.2019
comment
@CuriousMind, можно ли это сделать с помощью бобов? Я использую встроенный сервер Undertow.   -  person sam    schedule 29.03.2019


Ответы (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>

Очень важный момент, который следует отметить, заключается в том, что мне пришлось удалить небезопасное перенаправление с http на https в конфигурации Undertow Server, так как оно выдало ошибку - "СЛИШКОМ МНОГО ПЕРЕНАПРАВЛЕНИЙ". Итак, что я сделал, так это оставил открытыми два порта — 80 и 443 для небезопасных и безопасных соединений, а конфигурация tuckey выполняет все виды перенаправления, с http на https и с не-www на www. Я надеюсь, что это помогает.

person sam    schedule 31.03.2019
comment
Это здорово, вы сэкономили мне много времени. - person Ima Miri; 05.02.2020