1

我在 Apache 网络服务器上有一个 AngularJS 应用程序,我希望它被搜索引擎(即 Google/Bing 机器人等)索引。我有一个 PhantomJS 脚本来抓取我网站上的页面并拍摄快照,并且我已按照Google的说明将任何http://mysite.com/?_escaped_fragment_= * 请求重定向到适当的页面。

我面临的问题是我在应用程序中有几条路线可以根据锚点更改内容,例如http://mysite.com/#!/abouthttp://mysite.com/#! /关于#overview。我希望将这些更改编入索引,但哈希字符“#”用于注释,甚至用反斜杠转义它都不起作用。我已经咨询了其他 SO 答案(例如Apache rewrite condition for ajax crawlingmod_rewrite page anchor),但我还没有找到有关如何处理锚点的说明。

我有两个问题。

  1. 有没有办法使用 mod_rewrite 将 URL 重定向到包含锚点的快照?例如,使用 '#' ('%23') 的转义版本:

    http://mysite.com/?_escaped_fragment_=about%23overview => http://mysite.com/snapshots/about#overview.html
    

    这是我目前在 .htaccess 文件中的内容,但它不适用于带有锚点的页面:

    RewriteEngine On                                                                
    Options +FollowSymLinks                                                         
    
    # Route for the index page
    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=/$                              
    RewriteRule ^(.*)$ snapshots/index.html [NC,L]  
    
    # All other routes                                
    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=/?(.*)$                         
    RewriteRule ^(.*)$ snapshots/%1.html [NC,L]                                     
    
  2. 如果不允许(1),我关于如何解决这个问题的想法是将所有 '#' 替换为 '.' 在快照的文件名中。然后我需要一个 mod_rewrite 规则,将 '#' 替换为 '.' 在 escaped_fragment 查询参数中。回到我的示例,我目前有一条规则,将采用 /?_escaped_fragment_=about#overview 并将其重新路由到 /snapshots/about.overview.html。

    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=/about%23overview$              
    RewriteRule ^(.*)$ snapshots/about.overview.html [NE,NC,L]                      
    

    我可以使用一个简单的通用规则来实现这种类型的路由吗?

对于如何使用一般重写条件解决此问题的任何其他想法将不胜感激,谢谢!

4

1 回答 1

1

我相信以下规则应该对您有用:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=([^&]+) [NC]
RewriteRule ^$ /snapshots/%1.html? [R,NE,L]   

它重定向/?_escaped_fragment_=about%23overview/snapshots/about%23overview.html

于 2013-10-04T17:47:59.113 回答