Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .htaccess用于搜索引擎优化机器人在没有散列的情况下抓取单页应用程序_Javascript_.htaccess_Web Crawler_Single Page Application - Fatal编程技术网

Javascript .htaccess用于搜索引擎优化机器人在没有散列的情况下抓取单页应用程序

Javascript .htaccess用于搜索引擎优化机器人在没有散列的情况下抓取单页应用程序,javascript,.htaccess,web-crawler,single-page-application,Javascript,.htaccess,Web Crawler,Single Page Application,使用pushState启用页面,通常使用转义片段约定重定向搜索引擎优化机器人程序。你可以阅读更多关于这方面的信息 该约定假定您将在单个页面应用程序上的所有URI之前使用(#!)hashbang前缀。搜索引擎优化机器人会在发出页面请求时,用自己可识别的约定替换hashbang,从而逃逸这些片段 //Your page http://example.com/#!home //Requested by bots as http://example.com/?_escaped_fragment=hom

使用
pushState
启用页面,通常使用
转义片段
约定重定向搜索引擎优化机器人程序。你可以阅读更多关于这方面的信息

该约定假定您将在单个页面应用程序上的所有URI之前使用(
#!
)hashbang前缀。搜索引擎优化机器人会在发出页面请求时,用自己可识别的约定替换hashbang,从而逃逸这些片段

//Your page
http://example.com/#!home

//Requested by bots as
http://example.com/?_escaped_fragment=home
这允许站点管理员检测bot,并将它们重定向到缓存的预呈现页面

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
RewriteRule ^(.*)$  https://s3.amazonaws.com/mybucket/$1 [P,QSA,L]
问题在于,hashbang正在通过广泛采用的
pushState
支持迅速被淘汰。它也很难看,对用户来说不是很直观

那么,如果我们使用HTML5模式,pushState引导整个用户应用程序呢

//Your index is using pushState
http://example.com/

//Your category is using pushState (not a folder)
http://example.com/category

//Your category/subcategory is using pushState
http://example.com/category/subcategory
是否可以使用此更新的约定将规则向导机器人重写到缓存版本?谷歌还建议在页面的
中使用
选择加入方法。同样,这是一个单边缘的情况。这里我们讨论的是如何将每个页面作为一个opt-in-senario来处理

我认为
转义\u片段
仍然可以用作SEO机器人的标识符,并且我可以提取域和该标识符之间的所有内容以附加到我的bucket位置,如:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$
# (high level example I have no idea how to do this)
# extract "category/subcategory" == $2
# from http://example.com/category/subcategory?escaped_fragment=
RewriteRule ^(.*)$  https://s3.amazonaws.com/mybucket/$2 [P,QSA,L]

最好的处理方法是什么

在一个单页web应用程序上也有类似的问题

我找到的解决这个问题的唯一办法是有效地创建静态版本的页面,以便让谷歌(和其他)机器人能够导航

你可以自己做这件事,但也有一些服务可以做到这一点,为你创建静态缓存(并通过CDN向机器人提供快照)


我最终使用了SEO4Ajax,尽管还有其他类似的服务

我也有同样的问题。现在,我修改了.htaccess,如下所示:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
RewriteRule ^$ /snapshots/index.html? [L,NC]
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
RewriteRule ^(.*)$ /snapshots/$1.html? [L,NC]

不确定是否有更好的解决方案,但到目前为止它对我有效请确保快照的目录结构与URL结构匹配。

我正在使用Symfony2,尽管其他开发人员告诉我,Googlebot和Bingbot执行Javascript的能力足以生成自己的HTML片段,但我没有信心。我还觉得,对于关闭JS的ppl来说,提供静态资源是一个更好的选择(尽管这不太可能),因此我对提供HTML代码片段很感兴趣,只要不麻烦。以下是我正在考虑使用但尚未尝试的方法:

这里还有其他类似的SO问题(一个是我的)。

这是我在那个问题上发布的一个解决方案,我自己也在考虑,以防我想把HTML代码片段发送给机器人。这将是一个用于Symfony2后端的解决方案:

  • 使用prerender或其他服务生成所有页面的静态片段。将它们存储在路由器可以访问的地方
  • 在Symfony2路由文件中,创建与SPA匹配的路由。我在localhost.com/ng-test/上运行了一个测试SPA,因此我的路线如下所示:

    #向该路由添加尾随/将中断该路由。不知道为什么。

    #StackOverflow中的格式也不正确。我是yaml。

    NgTestReroute:

    ----path:/ng test/{one}/{two}/{three}/{four}

    ----默认值:

    ------------控制器:驱动器设计绑定:NgTest:NgTest重新路由

    ------------'one':null

    ------------'two':null

    ------------'three':null

    ------------'four':null

    ----方法:[GET]

  • 在Symfony2控制器中,检查用户代理以查看它是Google机器人还是bingbot。您应该能够使用下面的代码实现这一点,然后使用此列表以您感兴趣的机器人为目标()

    if(strstrstr(strtolower($\u SERVER['HTTP\u USER\u AGENT'),“googlebot”))

    {

    //怎么办

    }

  • 如果您的控制器发现与bot匹配,请将HTML代码段发送给它。否则,就像我的AngularJS应用程序一样,只需将用户发送到索引页面,Angular就会正确地完成其余的工作


  • 另外,如果您的问题得到了回答,请选择一个,这样我和其他人就可以告诉您什么对您有效。

    我正在使用PhantomJS生成页面的静态快照。我的目录结构只有一层深(
    root
    /projects
    ),因此我有两个.htaccess文件,其中我重定向到一个PHP文件(
    index bots.PHP
    ),该文件启动指向SPA
    index.html
    的PhantomJS进程,并打印出呈现的静态页面

    .htaccess文件如下所示:

    /.htaccess

    # redirect search engine bots to index-bots.php
    # in order to serve rendered HTML via phantomjs
    RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/index-bots\.php [NC]
    RewriteRule ^(.*)$ index-bots.php?url=%{REQUEST_URI} [L,QSA]
    
    # redirect search engine bots to index-bots.php
    # in order to serve rendered HTML via phantomjs
    RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ ../index-bots.php?url=%{REQUEST_URI} [L,QSA]
    
    /projects/.htaccess

    # redirect search engine bots to index-bots.php
    # in order to serve rendered HTML via phantomjs
    RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/index-bots\.php [NC]
    RewriteRule ^(.*)$ index-bots.php?url=%{REQUEST_URI} [L,QSA]
    
    # redirect search engine bots to index-bots.php
    # in order to serve rendered HTML via phantomjs
    RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ ../index-bots.php?url=%{REQUEST_URI} [L,QSA]
    
    几点注意:

    • -f
      重写条件
      至关重要!由于.htaccess将对所有请求应用
      RewriteRule
      s,因此页面上的每个资产都将被重写为PHP文件,从而使PhantomJS的多个实例旋转起来,并使服务器崩溃
    • 豁免
      index bots.php
      重写也很重要,以避免无休止的循环
    • 我在PhantomJS runner脚本中去掉了JS,以确保当支持JS的机器人遇到“静态”页面时,JS不会做任何事情
    • 我不是.htaccess向导,所以可能有更好的方法。如果是的话,我很想听

    Hi@dan kanze..我也遇到了同样的问题..你有什么解决方案或任何可以帮助我的东西吗..我一直在那里,pushState似乎要求你将这些文件夹放在光盘上。Th