CakePHP:高级'SEO'路由 - 如何保存旧网址 更改帖子的路由,用于外部链接的 301 重定向



我有一个新项目的路由问题。

对于大多数操作和实体,如用户,url永远不会改变,因为用户名是唯一的,不可更改的。对于这些东西,我们可以很容易地使用这样的路由:

Router::connect('/a/:username/topic/:id', array('controller' => 'users', 'action' => 'view'),array('pass' => array('username','id'),'username' => '[^-]+','id' => '[0-9]+'));
Router::connect('/a/:username', array('controller' => 'users', 'action' => 'view'),array('pass' => array('username'),'username' => '[^-]+'));

但是对于帖子(和其他一些实体),标题可能会因为打字错误或其他原因而改变。想象一下,你把一篇文章(或其他东西)的标题改了5次。每次都会建立一些外部链接。因此,我们要确保每个外部链接仍然工作,并重定向到当前的URL-Key与正确的/更改的标题与301状态。

因此,我们尝试实现一个包含以下字段的路由表:

id, source, ref_id, target_controller, target_action, target_param, parent_id

每次调用routes.php时,一个foreach循环将遍历表并连接所有没有父节点的路由。没有父项意味着,该记录是特定实体的当前(最近的)url键。

如果请求进入一个"旧的"url-key,我们自动重定向到父(最近的键)与301。

这确实工作得很好但是....:

之后,当该表包含数千条记录时,应用程序将读取所有这些记录(除非缓存是最新的),并将"router::connect"数千条路由,而不是像上面看到的5-10条非常通用的路由。而且每次我们的"路由缓存"过期时(这很可能是经常发生的)。

我问自己是否没有其他的解决方案来保持所有旧的路线运行,而不消耗很多性能。

我很高兴收到任何反馈。非常感谢!

比起在运行时生成数千条路由并缓存它们,您是否考虑过使用一个自定义Route类来简单地为当前请求计算路由?

现在在过去的弹头路线是有点棘手的,因为确保你有一个有效的弹头要么必须在控制器/模型级别完成,或者你必须连接几百条路线,每个文章弹头一个。两种实现都有很多需要改进的地方. ...

最新更新