我无法将我的非www域版本重定向到MovedContextHandler
的www,它没有重定向到的主机。
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
我该如何处理?我是否需要编写自己的处理程序或者有更简单的方法吗?
答案 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过滤器执行此操作:
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() {
}
}
<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)
两种简单的方法:
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>