Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CakePHP中路由所有未显式路由到特定控制器的内容_Php_Cakephp_Url Routing - Fatal编程技术网

在CakePHP中路由所有未显式路由到特定控制器的内容

在CakePHP中路由所有未显式路由到特定控制器的内容,php,cakephp,url-routing,Php,Cakephp,Url Routing,在CakePHP中,我想做一些特定的路由规则(主要是出于美观和SEO原因) 例如,我在代码中所做的是这样的: Router::connect('/c/:uni.html', array('controller' => 'contents', 'action'=>'index')); 现在如果有人打电话 我的站点/anyController/anyAction 我不希望CakePHP去那里,即使这个控制器真的存在(当然还有动作…) 例如: class AnyController ex

在CakePHP中,我想做一些特定的路由规则(主要是出于美观和SEO原因)

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

Router::connect('/c/:uni.html', array('controller' => 'contents', 'action'=>'index'));
现在如果有人打电话

我的站点/anyController/anyAction

我不希望CakePHP去那里,即使这个控制器真的存在(当然还有动作…)

例如:

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
    }

}

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

// your other routes

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

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

只要创建一条能捕获所有东西的路线就行了

// your other routes

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

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

复制内容的解决方案通常是一个“规范链接”标签,正如@dogmatic69所指出的

把这样一个标签放在你所有的页面上,你可以得到两个方面的最佳效果:保留Cake的默认路径,但将搜索引擎指向“正确”的URL

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

echo $this->Html->meta(
    'canonical',
    'http://example.com',
    array(
        'rel' => 'canonical',
        'type' => null,
        'title' => null,
        'inline' => false
     )
 );
而不是
http://example.com
您可以使用Cake的
url()
函数,该函数可以将操作和控制器作为参数,并始终返回自定义路由(称为)

总而言之,这应该能满足您的需求:

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
     )
 );

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

复制内容的解决方案通常是一个“规范链接”标记,正如@dogmatic69所指出的

把这样一个标签放在你所有的页面上,你可以得到两个方面的最佳效果:保留Cake的默认路径,但将搜索引擎指向“正确”的URL

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

echo $this->Html->meta(
    'canonical',
    'http://example.com',
    array(
        'rel' => 'canonical',
        'type' => null,
        'title' => null,
        'inline' => false
     )
 );
而不是
http://example.com
您可以使用Cake的
url()
函数,该函数可以将操作和控制器作为参数,并始终返回自定义路由(称为)

总而言之,这应该能满足您的需求:

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
     )
 );

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

这似乎会使它成为一个绝对的pita,可以在项目中工作-ajax调用如何-requestActions…等等-您将为需要通过URL点击的每个操作编写一条路由?(对不起,我知道这不是答案…)那没什么大不了的。我猜这有点像写20或30条规则,因为你可以通过制定好的规则,比如“:a/:b/:c”,来捕捉多条规则。我看不出这里有什么问题。我的问题是:避免重复内容。规范链接是实现这一点的正确方法。如果您坚持对所有可能的路由进行编码,并且希望阻止任何其他路由工作,请从
routes.php
(require)中删除默认路由。然后,只有您定义的路线才能工作;其他一切都将是404。看起来这将使它成为一个绝对的pita来处理项目-关于ajax调用-requestActions…等等-您将为每个需要通过URL点击的操作编写一个路由?(对不起,我知道这不是答案…)那没什么大不了的。我猜这有点像写20或30条规则,因为你可以通过制定好的规则,比如“:a/:b/:c”,来捕捉多条规则。我看不出这里有什么问题。我的问题是:避免重复内容。规范链接是实现这一点的正确方法。如果您坚持对所有可能的路由进行编码,并且希望阻止任何其他路由工作,请从
routes.php
(require)中删除默认路由。然后,只有您定义的路线才能工作;其他一切都将是404。是的,我知道这不是一个“好”的解决方案。但是:你是怎么做到的?你不希望A页有两种不同的访问方式,是吗?这就是你的目的。Cake将始终使用第一个匹配的路由生成url,因此在使用数组创建链接时,您不会在同一位置使用不同的url。您能指出这一点吗?我没有发现蛋糕自动生成规范的任何东西。我知道我可以手动操作,但这也不是一个好的解决方案。是的,我知道这不是一个“好”的解决方案。但是:你是怎么做到的?你不希望A页有两种不同的访问方式,是吗?这就是你的目的。Cake将始终使用第一个匹配的路由生成url,因此在使用数组创建链接时,您不会在同一位置使用不同的url。您能指出这一点吗?我没有发现蛋糕自动生成规范的任何东西。我知道我可以手动完成,但这也不是一个好的解决方案。好吧,这就是我已经想到的。我想我要像这样展开助手。thxOkay这就是我已经想到的。我想我要像这样展开助手。谢谢