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

Redirect 将域的非www版本重定向到Jetty中的www,redirect,dns,jetty,Redirect,Dns,Jetty,我无法使用MovedContextHandler将我的非www域版本重定向到www,它没有要重定向到的主机 www.example.com和example.com都指向我的web服务器IP。当有人试图打开example.com时,他仍然可以通过这种方式访问我的网站。我想让他的浏览器接收HTTP 301重定向到www.example.com。这对于搜索排名很重要,因为搜索引擎必须知道example.com和www.example.com是一个整体 作为奖励,当有人试图访问example.com/s

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

www.example.com
example.com
都指向我的web服务器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


我该怎么做呢?我是否需要编写自己的处理程序,还是有更简单的方法?

两种简单的方法:

  • 如果jetty前面有apache或任何其他前端服务器,则可以使用mod_rewrite或前端服务器的任何功能
  • 如果您希望在jetty端完成此操作,我建议您在应用程序中编写一个过滤器(映射到/*或servlet映射的任何内容),以完成重定向工作。这种过滤器的长度不应超过几行

IMHO过滤器解决方案比编写自己的处理程序或调整jetty配置要好,因为在jetty升级和产品发布期间,您的工作量要少得多。你的应用程序中会有你所需要的一切,因此在部署过程中不必担心环境问题。

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

/
http://www.somedomain.com
真的
假的
假的

要避免重定向循环,您必须定义此规则的工作原理

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

/
http://www.example.com
真的
假的
假的
example.com

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

DomainRedirectionFilter.java
公共类DomainRedirectionFilter实现过滤器{
@凌驾
public void init(FilterConfig FilterConfig)抛出ServletException{
}
@凌驾
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException,
ServletException{
HttpServletRequest httpRequest=(HttpServletRequest)请求;
String requestURL=httpRequest.getRequestURL().toString();
URL=新URL(请求URL);
如果(!url.getHost().startsWith(“www.”){
HttpServletResponse HttpServletResponse=(HttpServletResponse)响应;
httpServletResponse.setStatus(httpServletResponse.SC_永久移动);
httpServletResponse.setHeader(“Location”,requestURL.replace(“:/”,“://www.”);
}否则{
链式过滤器(请求、响应);
}
}
@凌驾
公共空间销毁(){
}
}
web.xml

域重定向筛选器
com.invenline.orgamer.web.servletFilter.DomainRedirectionFilter
域重定向筛选器
/*

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

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

谢谢你,朋友,我做的一切都没有网络应用。因为我的内容大多是静态的,我不希望涉及额外的复杂性。我想要服务器的最高速度。即使是我使用的少数servlet也直接在XML配置中注册。我希望避免编写过滤器。请参阅servlet过滤器解决方案。此规则的思想是为其他规则未涵盖的所有不同虚拟主机名变体提供服务。明确定义所有这些概念的目的是什么?这将具体保存哪些重定向?仅供参考:在jetty 9中,这应该放在webapps/目录中