Javascript 使用主干路由器处理搜索引擎优化内容索引的Hashbang?

Javascript 使用主干路由器处理搜索引擎优化内容索引的Hashbang?,javascript,ajax,backbone.js,single-page-application,hashbang,Javascript,Ajax,Backbone.js,Single Page Application,Hashbang,My使用路由器,它使用pushstate和哈希URL作为回退方法。我打算使用。也就是说,我想将我的网站索引到由生成的静态.html文件中,并通过URL将其发送到Google: mysite.com/?\u转义\u片段\u=key=value 请记住,该站点不为最终用户提供静态页面(它仅适用于支持Javascript的浏览器)。如果导航到mysite.com/some/url,则.htaccess文件将设置为始终提供mysite.com/index.php,主干路由器将读取url,以便显示该url

My使用路由器,它使用pushstate和哈希URL作为回退方法。我打算使用。也就是说,我想将我的网站索引到由生成的静态.html文件中,并通过URL将其发送到Google:

mysite.com/?\u转义\u片段\u=key=value

请记住,该站点不为最终用户提供静态页面(它仅适用于支持Javascript的浏览器)。如果导航到
mysite.com/some/url
,则.htaccess文件将设置为始终提供
mysite.com/index.php
,主干路由器将读取url,以便显示该url的JavaScript生成内容

此外,为了让谷歌为我的整个网站编制索引,我计划创建一个包含hashbang URL的列表。必须对URL进行哈希处理,以便Google知道如何使用\u转义\u片段\u键对站点进行索引

苏呜

(1)这种方法有效吗?

(2)既然backbone.js不使用hashbang URL,当用户 通过谷歌到达?


参考资料:

让我总结一下我在即将出版的关于SPA的书中写了大约10页的内容。谷歌想要一个你网站的经典版本。这也是一个优势,因为过时的浏览器无论如何都不能有效地进行SPA。为爬行器和旧浏览器提供一个核心站点

我从高尔迪亚报纸上得到这个词

在浏览器中,检查浏览器是否切芥末,以下是我的脚本:

<script>

    if (!('querySelector' in document)
         || !('localStorage' in window)
         || !('addEventListener' in window)
        || !('matchMedia' in window)) {

        if (window.location.href.indexOf("#!") > 0) {
            window.location.href = window.location.href.replace("#!", "?_escaped_fragment_=");
        } else {
            if (window.location.href.indexOf("?_escaped_fragment_=") < 0) {
                window.location.href = window.location.href + "?_escaped_fragment_=";
            }
        }

    } else {

        if (window.location.href.indexOf("?_escaped_fragment_=") >= 0) {
            window.location.href = window.location.href.replace("?_escaped_fragment_=", "#!");
        }
    }

</script>

if(!(‘querySelector’在文档中)
||!(“本地存储”在窗口中)
||!(“窗口”中的“addEventListener”)
||!(窗口中的“matchMedia”){
if(window.location.href.indexOf(“#!”)>0){
window.location.href=window.location.href.replace(“#!”,“?_转义_片段=”);
}否则{
if(window.location.href.indexOf(“?\u转义\u片段=”)<0){
window.location.href=window.location.href+“?\u转义\u片段=”;
}
}
}否则{
if(window.location.href.indexOf(“?\u转义\u片段=”)>=0){
window.location.href=window.location.href.replace(“?_转义_片段=”,“#!”);
}
}
在服务器上,您需要一些机制来检查是否存在_escape_fragment_uquerystring。如果存在,您需要为核心站点提供服务。核心站点只使用简单的CSS,很少或根本不使用JavaScript。我有一个ASP.NET MVC的SPAHelper库,您可以查看我在这方面实现的一些东西


真正的问题是,大多数服务器端web框架(如ASP.NET、PHP等)都不是为支持客户端和服务器的单一视图系统而设计的。因此,您需要维护两个视图。我再次为我的书围绕这个主题写了大约10页,应该在下周的某个时候准备好。

正如我在问题中概述的那样,我最终在实现过程中遇到了障碍。所以

(1)是的,这种方法似乎相当有效。唯一的缺点是,即使应用程序不使用hashbang,我的sitemap.xml也充满了hashbang URL。这是谷歌在抓取这些页面时应该查询“转义”URL的必要提示。因此,当该网站出现在谷歌搜索结果中时,URL中会出现一个hashbang,但这是一个很小的代价

(2)这部分比我想象的要容易得多。在初始化Backbone.js路由器之前只需要一行代码

window.location.hash = window.location.hash.replace(/#!/, '#');

var AppRouter = Backbone.Router.extend({...
hashbang被一个hash替换后,主干路由器将自动删除支持pushState的浏览器的hash。此外,这两个URL状态更改不会保存在浏览器的历史记录状态中,因此如果用户单击“后退”按钮,则不会出现奇怪/意外的重定向

更新:更好的方法 事实证明,有一种非常简单的方法可以完全消除hashbang。通过:

如果你的网站使用的是hashbangs(#!)URL,那么谷歌将对你的网站进行爬网 通过替换#创建站点!带?转义_片段=。当你看到 ?escaped_fragment=,您将知道请求来自爬虫如果 您正在使用html5 pushState,然后查看“UserAgent”标题 确定请求是否来自机器人。

这是BromBone建议的修改版本。htaccess重写规则:

    RewriteEngine On
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_USER_AGENT} .*Googlebot.* [OR]
    RewriteCond %{HTTP_USER_AGENT} .*Bingbot.* [OR]
    RewriteCond %{HTTP_USER_AGENT} .*Baiduspider.* [OR]
    RewriteCond %{HTTP_USER_AGENT} .*iaskspider.*
    RewriteRule ^(.*)$ snapshot.php/$1 [L]

克里斯,谢谢你的回复。在我的问题中,我写道该网站没有非JavaScript版本。瞧,旧的浏览器是SOL。这是设计的,因为这是一个基于地图的应用程序。此外,重定向到转义的_片段URL也无法达到目的,因为hashbang URL位于sitemap.xml中,因此这些URL是Google将向用户发送的URL(当该站点出现在Google的搜索结果中时)。如果您阅读Google指南,则需要在服务器上生成文档,就像经典站点一样。因此,为什么要使用转义片段查询字符串变量。您必须为spider提供核心站点,以满足标准。这个#!片段不会被发送到服务器,因此?。站点地图应该有#!版本,蜘蛛知道如何将该url转换为querystring版本。我不反对你刚才所说的。我的观点是从#执行JavaScript重定向!指向转义片段URL的URL是错误的方法。谷歌将在看到#!时自动查找转义的_片段URL!。此外,重定向会将你的用户准确地发送到他们不应该发送到的地方,即:只针对爬行器的静态html页面。我决定利用搜索引擎需要一个核心站点的优势