在CakePHP中路由所有未显式路由到特定控制器的内容
在CakePHP中,我想做一些特定的路由规则(主要是出于美观和SEO原因) 例如,我在代码中所做的是这样的:在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
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这就是我已经想到的。我想我要像这样展开助手。谢谢