Apache重写条件,以便ajax爬行到具有锚点的页面

时间:2013-10-04 17:39:44

标签: ajax regex apache .htaccess mod-rewrite

我在Apache网络服务器上有一个AngularJS应用程序,我想通过搜索引擎(即Google / Bing机器人等)编制索引。我有一个PhantomJS脚本来抓取并拍摄我网站上的网页快照,我已经关注了the instructions from Google如何将任何http://mysite.com/?_escaped_fragment_= *请求重定向到相应的网页。

我面临的问题是,我在应用中有一些路径可以根据锚点更改内容,例如http://mysite.com/#!/abouthttp://mysite.com/#!/about#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]                      
    

    我是否可以使用简单的通用规则来实现此类路由?

  3. 有关如何通过一般重写条件解决此问题的任何其他想法将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

我相信以下规则适合您:

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

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