我遵循了谷歌指南使 AJAX 应用程序可抓取,以使我的 AngularJS 应用程序可抓取以用于 SEO 目的。所以我使用#! (hashbang) 在我的路线配置中:
$locationProvider.hashPrefix('!');
所以我的网址看起来像这样:
http://www.example.com/#!/page1.html
http://www.example.com/#!/page2.html
...
当 google 替换为时hashbangs (#!)
,?_escaped_fragment_=
我通过我的.htaccess
文件将 google bots 重定向到页面的快照:
DirectoryIndex index.html
RewriteEngine On
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=/?(.*)$
RewriteRule ^(.*)$ /snapshot/%1? [NC,L]
到目前为止,一切都像一个魅力。当机器人请求以下 URLhttp://www.example.com/#!/page1.html
时,它将替换 hashbang 并实际请求http://www.example.com/?_escaped_fragment_=/page1.html
我重定向到所请求页面的静态/预呈现版本。
所以我sitemap.xml
通过Google Webmaster ToolsSearch Console
提交了我的。我的站点地图中的所有 URL 都被谷歌正确索引,但不是域本身。所以这意味着这样的页面:
http://www.example.com/#!/page1.html
被正确编入索引,通过谷歌搜索我的任何子页面的特定内容,谷歌找到了正确的页面。问题是start/homepage
“自然”没有hashbang的本身:
http://www.example.com/
当用户访问该站点时,此处会附加 hashbang(通过我的路由器配置中的 javascript)。但看起来谷歌机器人并非如此。
所以爬虫没有“看到” hashbang,因此在这里不使用静态版本,这是一个大问题,因为特别是在这里我提供了最重要的内容。我已经尝试/
通过.htaccess
to重写和重定向,/#!/
但这最终导致许多重定向并使一切崩溃。我也尝试使用
<meta name="fragment" content="!">
在index.html
. 但这根本没有帮助。以前有没有其他人遇到过这个问题?