2

在我的 web.xml 文件中,我配置了:

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

这意味着,当我输入 URL 时www.domain.comindex.xhtml文件用于呈现。但是当我输入时www.domain.com/index.xhtml,结果是一样的。是否称为重复内容?这对我的项目来说没问题,但对 SEO 来说是个大问题。如何www.domain.com/index.xhtml在键入 URL 时重定向到页面www.domain.com而不是让它执行转发?

4

2 回答 2

2

当同一个域上有另一个 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.
}
于 2013-11-25T11:16:22.447 回答
0

要删除重复的内容,请设计一个带有 URL 模式的过滤器/*。如果用户在根域上而不是重定向到index.xhtmlURL。

@WebFilter(filterName = "IndexFilter", urlPatterns = {"/*"})
public class IndexFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;
    String requestURL = request.getRequestURI().toString();
    if (request.getServletPath().equals("/index.xhtml") &&
                !requestURL.contains("index.xhtml")) {
        response.sendRedirect("http://" + req.getServerName() + ":"
                + request.getServerPort() + request.getContextPath()
                +"/index.xhtml");
    } else {
        chain.doFilter(req, resp);
    }
}
 }
于 2013-11-24T17:07:38.007 回答