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后端的解决方案:
#向该路由添加尾随/将中断该路由。不知道为什么。
#StackOverflow中的格式也不正确。我是yaml。
NgTestReroute:
----path:/ng test/{one}/{two}/{three}/{four}
----默认值:
------------控制器:驱动器设计绑定:NgTest:NgTest重新路由
------------'one':null
------------'two':null
------------'three':null
------------'four':null
----方法:[GET]
if(strstrstr(strtolower($\u SERVER['HTTP\u USER\u AGENT'),“googlebot”))
{
//怎么办
}
另外,如果您的问题得到了回答,请选择一个,这样我和其他人就可以告诉您什么对您有效。我正在使用PhantomJS生成页面的静态快照。我的目录结构只有一层深(
root
和/projects
),因此我有两个.htaccess文件,其中我重定向到一个PHP文件(index bots.PHP
),该文件启动指向SPAindex.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将对所有请求应用重写条件
s,因此页面上的每个资产都将被重写为PHP文件,从而使PhantomJS的多个实例旋转起来,并使服务器崩溃RewriteRule
- 豁免
重写也很重要,以避免无休止的循环index bots.php
- 我在PhantomJS runner脚本中去掉了JS,以确保当支持JS的机器人遇到“静态”页面时,JS不会做任何事情
- 我不是.htaccess向导,所以可能有更好的方法。如果是的话,我很想听