将非www版域的域重定向到Jetty中的www

时间:2010-08-21 21:50:54

标签: redirect dns jetty

我无法将我的非www域版本重定向到MovedContextHandler的www,它没有重定向到的主机。

www.example.comexample.com都指向我的网络服务器IP。当有人试图打开example.com时,他仍然能够以这种方式访问​​我的网站。我希望他的浏览器接收HTTP 301重定向到www.example.com。这对搜索排名很重要,因为搜索引擎必须知道example.comwww.example.com是同一个。

作为奖励,当有人试图访问example.com/somepath/somepage.html时,我希望HTTP 301重定向到www.example.com/somepath/somepage.html

我该如何处理?我是否需要编写自己的处理程序或者有更简单的方法吗?

5 个答案:

答案 0 :(得分:7)

要避免重定向循环,您必须定义此规则的虚拟主机。

<?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>

答案 1 :(得分:2)

我只想为那些使用嵌入式码头的人写下自己的答案:

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"});

答案 2 :(得分:1)

您可以使用自定义servlet过滤器执行此操作:

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>

答案 3 :(得分:0)

两种简单的方法:

  • 如果您在码头前有apache或任何其他前端服务器,那么您可以使用mod_rewrite或前端服务器为此目的使用的任何服务器,
  • 如果你想在jetty端完成它,我建议你在应用程序中编写一个Filter(映射到/ *或者你的servlet映射是什么),这将执行重定向工作。这样的过滤器不应该长于几行。

IMHO过滤器解决方案比编写自己的处理程序或调整jetty配置要好,因为在jetty升级和生产版本中你的工作量会少得多。您可以在应用程序中获得所需的一切 - 因此在部署过程中无需担心环境。

答案 4 :(得分:0)

我通过查看来源找到了解决方案。您只需要在MovedContextHandler中指定要重定向到的URL中的架构。像这样: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>