使用mod_rewrite和Zend框架显示动态sitemap.xml
前几天在创建网站时,我考虑了如何管理sitemap.xml文件。该文件基本上是一个包含URL列表的XML文件。大多数主要的搜索引擎都了解(并查找)此文件,因此绝对必须将其显示在网站上。
sitemap.xml每次添加新记录或其他内容时,我一直在由应用程序创建文件之前一直走这条路,但是由于这是一个高流量,多用户的站点,因此这种方法会遇到很多问题。主要的问题(除了潜在的性能影响之外)是,我将不得不花费数小时将对sitemap.xml创建文件的调用绑定到我的应用程序中。
然后,我想到了使用RewriteRule的想法,该规则会将控制器屏蔽为sitemap.xml文件。这意味着sitemap.xml控件可以与应用程序的所有其他部分保持隔离(因此我可以再次使用同一模板),但是我也可以使用Zend_Cachesitemap.xml每天缓存文件,从而节省处理时间。
首先,我需要创建一个RewriteRule,它将调用重定向sitemap.xml到Sitemap控制器。
RewriteRule^(.*)sitemap.xml$/sitemap/index[L]
接下来,我创建了Sitemap控制器,并确保index操作未显示布局。URL作为数组传递到视图。
class SitemapController extends Zend_Controller_Action { public function indexAction() { $this->_helper->layout()->disableLayout(); $urls = array(array('loc'=>'http://www.nhooo.com/', 'lastmod'=>'2009-04-02T11:34:48+00:00', 'changefreq'=>'daily', 'priority'=>'1.0')); $this->view->urls = $urls; } }
为了使Sitemap控制器能够显示任何内容,需要具有一个视图才能呈现。这将创建文件的基本轮廓,并使用该partialLoop()功能打印出URL数组。
partialLoop('sitemap/_urlItem.phtml',$this->urls); ?>
这是文件_urlItem.phtml,该文件将为$this->urls数组中的每个项目呈现。
loc; ?> lastmod; ?> changefreq; ?> priority; ?>
我以为现在一切都可以正常工作,但是当我进入浏览器并试图找到sitemap.xml一条消息时,我说这sitemap.xml是一个无效的控制器。
为了测试,我在RewriteRule的末尾添加了一个重定向,以确保该规则有效。
RewriteRule^(.*)sitemap.xml$/sitemap/index[R=301,L]
这被重定向到正确的位置,因此肯定是导致错误发生的ZendFramework。经过一番思考,我意识到我可以创建一个路由,以将对缺少的sitemap.xml控制器的调用重新路由到现有的Sitemap控制器。这是我创建的规则,只需将其添加到您的引导文件中即可。
$router = $frontController->getRouter(); $router->addRoute( 'manageSitemap', new Zend_Controller_Router_Route('sitemap.xml', array('controller'=>'sitemap','action'=>'index')) );
sitemap.xml现在导航至,向我展示了Sitemap控制器的输出。