Cakephp网址为SEO定制

时间:2011-07-22 06:45:58

标签: url url-rewriting seo cakephp-1.3 url-routing


我正在开发一个医疗产品搜索网站。每当用户尝试搜索[COMPANY NAME]药物[DISEASE]时,我需要在搜索引擎中显示我的网站。为此,我在我的网站上创建了一个页面,其中显示了来自网址的公司名称和疾病,并列出了所有产品。

现在我需要给这个页面提供一个网址,如www.sitename.com/[COMPANY NAME] _medicine_ [DISEASE] .html
我正在使用Cakephp框架进行开发。无论如何在routes.php中实现这个url格式?或者还有其他方法吗?请帮忙。

1 个答案:

答案 0 :(得分:4)

用斜线分隔它们怎么样?

// www.sitename.com/[COMPANY NAME]/medicine/[DISEASE]

Router::connect('/:company/medicine/:disease', array('controller' => 'diseases', 'action' => 'index'),
                                               array('pass'=>array('company','disease'),
                                               'company'=>"[a-zA-Z\.]+*",
                                               'disease'=>'[a-zA-Z\.]+'));

和控制器

function diseases($company,$disease){

}

我不确定你是否可以使用下划线而不是斜线,我以前从未尝试过。如果你尝试我想知道结果=)

祝你好运

已编辑:好的,我对这个问题太好奇了,我写了一条这样的路线

Router::connect('/:company_medicine_:disease', array('controller' => 'pages', 'action' => 'test'),
                                               array('pass'=>array('company','disease'),
                                               'company'=>'[a-zA-Z]+',
                                               'disease'=>'[a-zA-Z]+'));

并且它不起作用u_U

正如我所怀疑的那样,问题是Cake认为custom route element的名称是:company_medicine而不是:company ...几分钟之后关于/读取Cake i的代码找到了Cake解析路径的确切位置,并提取了传递元素的名称。它位于 CakeRoute /cake/libs/router.php 中,方法 _writeRoute()(关于第1369行):

preg_match_all('#:([A-Za-z0-9_-]+[A-Z0-9a-z])#', $parsed, $namedElements);

正如你在regexp中看到的那样,元素的名称可以包含下划线,因此Cake认为参数的名称是“:company_medicine”。 所以你有四个解决方案:

  • 使用斜杠作为网址的分隔符
  • 更改参数的顺序,使其为medicine_[COMPANY]_[DISEASE]
  • router.php 的第1369行修改为此(不推荐,我认为它会破坏插件的路径):

    preg_match_all('#:([A-Za-z0-9]+)#', $parsed, $namedElements);

  • 在你的.htaccess中使用url重写将所有[COMPANY]_medicine_[DISEASE]重定向到[COMPANY]/medicine/[DISEASE],这样蛋糕会看到它用斜线分隔,浏览器会看到它与下划线分开。 (我还没有测试过,我从来没有在.htaccess中为Cake = P添加另一个规则)