CakePHP 3:生成缩短的URL(规范)

我正在尝试防止重复的内容.
我的帖子原始网址是这样的:

domain.com/post/52-quick-brown-fox-jumps-over-lazy-dog

我想生成一个缩短的网址,并使用它们共享,例如twitter

domain.com/p/52 —-> redirects to —> original url

怎么办呢?通过htaccess 301重定向?通过CakePHP路由?

谢谢!

解决方法:

重定向本身应该是301(永久移动),因此所有指向短网址的链接都映射到了Google索引中的长网址.

Router类具有自己的重定向方法.您基本上可以复制您的实际路线,用重定向替换connect并更改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类生成短网址,因为它将始终根据传递的参数生成长网址.您将必须根据ID手动生成它们.

确保Controller检查是否存在正确的子段,如果没有,则执行重定向到正确的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']
]);

如果该段错误或不存在,则Controller仍应重定向到正确的URL.

上一篇:php-Codeigniter重定向URL问题


下一篇:php – HMVC codeigniter在本地服务器上运行,但在Web服务器上运行