Перенаправить не www версию домена на www в Jetty - PullRequest
5 голосов
/ 22 августа 2010

Я не могу перенаправить свою версию домена без www на www с MovedContextHandler, у него нет хоста для перенаправления на.

И www.example.com, и example.com указывают на IP-адрес моего веб-сервера. Когда кто-то пытается открыть example.com, он все равно может получить доступ к моему сайту таким образом. Я хочу, чтобы его браузер получал перенаправление HTTP 301 на www.example.com. Это важно для поисковых рейтингов, так как поисковые системы должны знать, example.com и www.example.com - это одно и то же.

В качестве бонуса, когда кто-то пытается получить доступ к example.com/somepath/somepage.html Я хочу перенаправить HTTP 301 на www.example.com/somepath/somepage.html

Как мне поступить с этим? Нужно ли писать свой собственный обработчик или есть более простой способ?

Ответы [ 5 ]

7 голосов
/ 12 ноября 2010

Чтобы избежать цикла перенаправлений, вы должны определить, на каком виртуальном хосте работает это правило.

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">

<Configure class="org.eclipse.jetty.server.handler.MovedContextHandler">
  <Set name="contextPath">/</Set>
  <Set name="newContextURL">http://www.example.com</Set>
  <Set name="permanent">true</Set>
  <Set name="discardPathInfo">false</Set>
  <Set name="discardQuery">false</Set>

  <Set name="virtualHosts">
    <Array type="String">
          <Item>example.com</Item>
    </Array>
  </Set>

</Configure>
2 голосов
/ 03 февраля 2017

Я просто хочу написать свой собственный ответ для тех, кто использует встроенный причал:

MovedContextHandler rewriteHandler = new MovedContextHandler();
rewriteHandler.setContextPath("/");
rewriteHandler.setNewContextURL("http://www.example.com");
rewriteHandler.setPermanent(true);
rewriteHandler.setDiscardPathInfo(false);
rewriteHandler.setDiscardQuery(false);
rewriteHandler.setVirtualHosts(new String[] {"example.com"});
1 голос
/ 19 мая 2014

Вы можете сделать это с помощью пользовательского фильтра сервлетов:

DomainRedirectionFilter.java

public class DomainRedirectionFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURL = httpRequest.getRequestURL().toString();
        URL url = new URL(requestURL);

        if (!url.getHost().startsWith("www.")) {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            httpServletResponse.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
            httpServletResponse.setHeader("Location", requestURL.replace("://", "://www."));
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }
}

web.xml

<filter>
    <filter-name>DomainRedirectionFilter</filter-name>
    <filter-class>com.invenline.orgamer.web.servletFilter.DomainRedirectionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>DomainRedirectionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
0 голосов
/ 25 августа 2010

Я нашел решение, посмотрев на источник.Вам просто нужно указать схему в URL-адресе, на который вы перенаправляете внутри MovedContextHandler.Например: http://www.somedomain.com Если вы делаете только www.somedomain.com, перенаправление не будет работать должным образом.

Это мой redirector.xml

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">

<Configure class="org.eclipse.jetty.server.handler.MovedContextHandler">
  <Set name="contextPath">/</Set>
  <Set name="newContextURL">http://www.somedomain.com</Set>
  <Set name="permanent">true</Set>
  <Set name="discardPathInfo">false</Set>
  <Set name="discardQuery">false</Set>
</Configure>
0 голосов
/ 24 августа 2010

Два простых способа сделать это:

  • если у вас есть apache или любой другой передний сервер перед Jetty, вы можете использовать mod_rewrite или все, что имеет передний сервер для этой цели,
  • если вы хотите, чтобы это было выполнено на пристани, я бы предложил вам написать в вашем приложении фильтр (сопоставленный с / * или каким-либо другим образом, соответствующим вашему сервлету), который бы выполнял работу по перенаправлению. Такой фильтр не должен быть длиннее пары строк.

ИМХО решение для фильтрации лучше, чем написание собственного обработчика или настройка конфигурации пристани, потому что вам будет гораздо меньше работы во время обновлений пристани и производственных выпусков. В вашем приложении будет все, что вам нужно, поэтому вам не нужно беспокоиться об окружении во время развертывания.

...