当同一个域上有另一个 URL 返回完全相同的响应时,一个 URL 被标记为重复内容。是的,如果 SEO 很重要,您绝对应该担心这一点。
解决此问题的最简单方法是在index.xhtml
. 这应该代表首选的 URL,在您的特定情况下显然是具有文件名的 URL:
<link rel="canonical" href="http://www.domain.com/index.xhtml" />
这样,http://www.domain.com
将被索引为http://www.domain.com/index.xhtml
. 并且不再导致重复的内容。但是,这不会阻止最终用户无论如何都能够为不同的 URL 添加书签/共享。
另一种方法是配置 HTTP 301 重定向到首选 URL。了解 302 重定向的来源仍然被搜索机器人索引是非常重要的,但 301 重定向的来源不是,只有目标页面被索引。如果您将使用 302 作为默认使用的 302 HttpServletResponse#sendRedirect()
,那么您最终仍将拥有重复的内容,因为这两个 URL 仍被编入索引。
这是此类过滤器的启动示例。/index.xhtml
当 URI 不等于所需路径时,只需将其映射并执行 301 重定向。
@WebFilter(urlPatterns = IndexFilter.PATH)
public class IndexFilter implements Filter {
public static final String PATH = "/index.xhtml";
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String uri = request.getContextPath() + PATH;
if (!request.getRequestURI().equals(uri)) {
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301
response.setHeader("Location", uri);
response.setHeader("Connection", "close");
} else {
chain.doFilter(req, res);
}
}
// init() and destroy() can be NOOP.
}