我正在努力防止重复的内容。 我的帖子原网址是这样的:
domain.com/post/52-quick-brown-fox-jumps-over-lazy-dog
我想生成一个缩短的 url 并用它们分享,例如,twitter
domain.com/p/52 ----> redirects to ---> original url
如何做到这一点?通过 htaccess 301 重定向?通过 CakePHP 路由?
谢谢!
最佳答案
重定向本身应该是 301(永久移动),因此所有指向短网址的链接都映射到谷歌索引中的长网址。
Router 类有自己的redirect
方法。您基本上复制了您的实际路线,将 connect
替换为 redirect
并更改 url 模式以匹配您的短 url:
$routes->redirect('/p/:id', ['controller' => 'Posts', 'action' => 'display'], [
'pass' => ['id'],
'status' => 301,
'persist' => true
]);
$routes->connect('/post/:id-:slug', ['controller' => 'Posts', 'action' => 'display'], [
'pass' => ['id', 'slug']
]);
唯一的缺点:据我所知,您将无法从 Router 类生成短 url,因为它总是从传递的参数生成长 url。您必须从 id
手动生成它们。
确保 Controller 检查是否存在正确的 slug,如果不是,则执行重定向到正确的 url。您可以使用 Controllers redirect()
method .
public function display($id, $slug = null) {
$post = $this->Posts->findById($id);
if($post) {
if($post->slug !== $slug) {
return $this->redirect('/post/' . urlencode($id . '-' . $slug), 301);
}
//Other stuff
} else {
$this->Flash->error('The post was not found.');
return $this->redirect('/posts');
}
}
如果你想避免双重重定向,你可能想使用 connect
而不是 redirect
(感谢 ndm 的评论):
$routes->connect('/p/:id', ['controller' => 'Posts', 'action' => 'display'], [
'pass' => ['id'],
'status' => 301
]);
$routes->connect('/post/:id-:slug', ['controller' => 'Posts', 'action' => 'display'], [
'pass' => ['id', 'slug']
]);
如果 slug 错误或不存在, Controller 仍应重定向到正确的 url。
关于php - CakePHP 3 : Generate shortened url (canonical),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32733809/