路由未明确路由到CakePHP中特定控制器的所有内容

时间:2012-12-21 22:17:28

标签: php cakephp url-routing

在CakePHP中我想做特定的路由规则(主要是出于美容和搜索引擎优化的原因)。

例如,我在代码中做的是这样的:

Router::connect('/c/:uni.html', array('controller' => 'contents', 'action'=>'index'));

现在如果有人打电话

  

MY_SITE / anyController / anyAction

我不希望CakePHP去那里,即使这个Controller确实存在(当然还有行动......)

示例:

class AnyController extends AppController {
    var $helper = array('Html');

    /**
     * landingpage
     */
    private function anyAction() {
        //this action must not be called by /anyController/anyAction
                    //but only by my own defined route
    }

}

2 个答案:

答案 0 :(得分:2)

重复内容的解决方案通常是'规范链接'标记,正如@ dogmatic69指出的那样。

在所有页面上放置这样的标签,您可以充分利用这两个方面:保留Cake的默认路由,但将搜索引擎指向“正确”的URL。

这是您在视图中插入规范链接标记的方式:

echo $this->Html->meta(
    'canonical',
    'http://example.com',
    array(
        'rel' => 'canonical',
        'type' => null,
        'title' => null,
        'inline' => false
     )
 );

您可以使用Cake的http://example.com函数代替url(),它可以将操作和控制器作为参数,并始终返回您的自定义路径(这称为reverse routing)。 / p>

$this->Html->url(array(
    'controller' => 'foo',
    'action' => 'bar'
));

总而言之,这应该给你你想要的东西:

echo $this->Html->meta(
    'canonical',
    $this->Html->url(array(
        'controller' => $this->request->params['controller'],
        'action' => $this->request->params['action']
    )),
    array(
        'rel' => 'canonical',
        'type' => null,
        'title' => null,
        'inline' => false
     )
 );

这会将当前视图的控制器/操作的第一个(您首选的)路由放入规范链接标记。

答案 1 :(得分:1)

创建一条捕获所有内容的路线

// your other routes

Router::connect('/*', array('contoler' => '...);

正如评论中所指出的,这不是一个好主意。它确实有用。