CakePHP:如何创建路由"后退"

时间:2013-12-09 14:11:03

标签: php cakephp routing cakephp-2.0

我们的网址结构一直在迅速发展,我们的日志有时会因尝试访问旧的,不存在的网址的用户填写404错误。我想保持日志清洁,并避免向这些用户显示404页面。有没有办法设置一个“后备”路线,以便,如果没有找到动作,用户登陆控制器的索引(或除错误页面之外的任何地方)。

我知道如何有条件地手动连接路线。到目前为止,我们一直在管理这个问题,但这是劳动密集型的,因为每次URL结构发生变化时我们都需要添加一个新的。

前:

Router::connect('/old/url/:param', array('controller' => 'new', 'action' => 'index'), array('param' => '.*[^0-9/]+.*'));

如果我们可以做这样的事情会更容易:

Router::connect('/some_controller/ + ...anything that doesnt exist', array('controller' => 'some_controller', 'action' => 'index') );

这可能吗?

更新

为了澄清,我不是简单地使用通配符的原因是:我需要连接/重定向的URL并不都遵循相同的模式。为了演示,这里有一些我正在尝试重定向的URL ...

example.com/a/b/ --> example.com/a/
example.com/a/b/34  --> example.com/a/
example.com/a/c/ --> example.com/a/

但我不想重定向这个......

example.com/a/d

所以我的问题没有通过Burzum在下面提出的建议(翻译为这个例子)来解决:Router::redirect('/a/b/*' ...Router::redirect('/a/*' ...因为这会错过应该定位的链接或应该(分别)的目标链接

当然,我可以为我想要定位的每个链接编写新的连接/重定向路由,但避免这个麻烦就是这个问题的重点。此外,它是一个完全“反应”的解决方案,因为我需要在检查调试日志并查看对不存在的控制器/操作/的请求后应用新路由。我正在努力保持主动,阻止我的日志在发生变化时填写错误的请求。

1 个答案:

答案 0 :(得分:0)

See the book for redirect routing。我不打算复制并粘贴整个部分,所以我建议你阅读链接。

根据您的评论我假设您不理解答案或您有其他要求。您的问题陈述如下:

  

我们的网址结构一直在快速发展,我们的日志有时会发展   填写404试图达到旧的,不存在的用户的错误   网址

对此的正确解决方案是使用重定向和HTTP状态301.以下部分取自官方文档和修改的示例,以帮助您理解它。

  

重定向路由允许您发出HTTP状态30倍重定向   传入路由,并将它们指向不同的URL。这很有用   您想通知客户端应用程序资源已移动和   您不希望为同一内容公开两个网址。

Router::redirect('/old/url/*', array('controller' => 'some', 'action' => 'index'), array('status' => 301));

Read about HTTP statuses, mostly 301

  

HTTP响应状态代码301 Moved Permanently用于   永久重定向,表示使用URL的当前链接或记录   应该收到301 Moved Permanently响应   已更新为响应的“位置”字段中提供的新URL。   此状态代码应与位置标头一起使用。 RFC 2616   说:

  • 如果客户端具有链接编辑功能,则应更新对Request URI的所有引用。
  • 响应可以缓存。
  • 除非请求方法是HEAD,否则实体应包含一个小的超文本注释,其中包含指向新URI的超链接。
  • 如果收到301状态代码以响应GET或HEAD以外的任何类型的请求,客户端必须在重定向之前询问用户。

<强>更新

  

此外,这是一个完全“反应”的解决方案,我需要应用新的   检查调试日志并查看请求后的路由   不存在的控制器/动作/。

嗯,这应该是一个有限的行动。因此,您必须将它们全部声明,至少对于每个控制器并确保它与一组操作匹配:

Router::redirect('/a/:action/*', array('controller' => 'some', 'action' => 'index'), array('status' => 301, 'action' => 'action1|action2'));

如果您想要匹配更多特定网址,则必须找到可以匹配的模式,或者您必须声明每个路由/重定向。

  

example.com/a/b/34

这看起来更像是一个不再被发现的特定记录。你应该有一个方法试图获取数据,在你的(希望)模型方法中抛出一个NotFoundException并在控制器中捕获它并使用$ this-&gt; redirect(array(...),301);重定向他们。

你应该在路线上使用301状态进行重定向的另一个原因是搜索引擎优化:如果你只是将相同的内容连接到多个网址,你很可能会对大多数搜索引擎产生负面影响。