使gwt网站可以抓取而不使用哈希符号?

时间:2014-08-27 08:14:27

标签: java gwt url-routing

在GWT中,我们需要在URL中使用 # 来从一个页面导航到另一个页面,例如用于创建历史记录。 www.abc.com/#questions/10245857但由于我在共享网址时遇到问题。 Google抓取工具仅在#之前读取网址,即www.abc.com

现在我想从我的网址中删除#,并希望将其保持为www.abc.com/question/10245857

我无法这样做。我怎么能这样做?

当用户导航应用程序时,我使用哈希网址和历史记录对象(如 不重新加载页面)。然而,有时它很好/需要有一个 漂亮的URL(例如用于共享,在公共场合展示等等)所以我想知道如何 提供同一页面的漂亮网址。

注意:
我们必须这样做才能使我们的网页网址可以抓取并将网站与外界联系起来。

1 个答案:

答案 0 :(得分:0)

这里有3个问题,每个问题都可以解决:

  1. 网址应该对用户更漂亮
  2. 直接访问漂亮的网址应该可以。
  3. WebCrawlers应该能够获取内容
  4. 这些似乎都是同一个问题,但在这种背景下它们是截然不同的。

    显示漂亮的网址

    可以使用HTML5 state methods的小javascript文件来完成。您可以使用here查看简单的演示source here。这使得对“#”的所有更改都显示为没有“#”(在现代浏览器上)。

    从小提琴中解决代码:

    var stateObj = {locationHash: hash};
    history.replaceState(stateObj, "Page Title", baseURL + hash.substring(1));
    

    Repsond to Pretty URL

    这是相对简单的,只要你在GWT中有一个监听器就可以在页面加载的基础上加载“#”了。您可以抛出一个简单的重定向servlet,在请求进入时重新插入它所属的“#”标记。

    对于servlet,请监听漂亮的URL:

    if(request.getPathInfo()!=null && request.getPathInfo().length()>1){
        response.sendRedirect("#" + request.getPathInfo());
        return;
    }
    

    或者,您可以直接从此servlet提供GWT应用程序,并使用URL中的参数对其进行初始化,但需要注意一些相对路径簿记。

    网络爬虫

    这是最棘手的一个。基本上你不能在这里找到静态(ish)页面。如果您正在索引的是一组有限的简单状态,那就不太难了。一个简单的方案是使用一个单独的servlet,它以最小格式的HTML返回您通常使用GWT获取的原始内容。此servlet可以具有不同的URL模式,如“/ indexing /”。这些不适合人类,仅适用于摄像头。您可以在< head>中添加一个简单的javascript。一旦页面加载,将用户重定向到漂亮的URL。

    以下是这种servlet的doGet方法的示例:

    response.setContentType("text/html;charset=UTF-8");
    response.setStatus(200);
    pw = response.getWriter();
    pw.println("<html>");
    pw.println("<head><script>");
    pw.println("window.location.href='http://www.example.com/#"
            + request.getPathInfo() + "';");
    pw.println("</script></head>");
    pw.println("<body>");
    pw.println(getRawPageContent(request.getPathInfo()));
    pw.println("</body>");
    pw.println("</html>");
    pw.flush();
    pw.close();
    return;
    

    然后,您应该只在主应用网址的某个位置(或主应用网址上的链接后面)隐藏这些索引页面的链接。