我们的网址结构一直在迅速发展,我们的日志有时会因尝试访问旧的,不存在的网址的用户填写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/*' ...
因为这会错过应该定位的链接或应该(分别)的目标链接
当然,我可以为我想要定位的每个链接编写新的连接/重定向路由,但避免这个麻烦就是这个问题的重点。此外,它是一个完全“反应”的解决方案,因为我需要在检查调试日志并查看对不存在的控制器/操作/的请求后应用新路由。我正在努力保持主动,阻止我的日志在发生变化时填写错误的请求。
答案 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 说:
<强>更新强>
此外,这是一个完全“反应”的解决方案,我需要应用新的 检查调试日志并查看请求后的路由 不存在的控制器/动作/。
嗯,这应该是一个有限的行动。因此,您必须将它们全部声明,至少对于每个控制器并确保它与一组操作匹配:
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状态进行重定向的另一个原因是搜索引擎优化:如果你只是将相同的内容连接到多个网址,你很可能会对大多数搜索引擎产生负面影响。