php - CakePHP 3 : Generate shortened url (canonical)

标签 php .htaccess cakephp redirect

我正在努力防止重复的内容。 我的帖子原网址是这样的:

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/

相关文章:

php - 除以零 - 数字小于一的 php 模数

PHP显示特定时间之间的链接

apache - 获取 .htaccess 以允许访问指定 IP,但如果来自任何其他 IP,则请求 .htpasswd 用户 + 密码

authentication - 如何从CakePHP的页面 Controller 中删除身份验证?

php - CakePHP 2.1.3 单个页面的 SEO 元描述与 default.ctp

CakePHP 1.3 替代 SoftDeletable 行为?

php - 如何通过 PHP 执行 SSH 命令

php - 数据库敏感信息放在哪里

.htaccess - 如何禁用 URL 中的 "?i=1"参数

php - Codeigniter - 404 页面未找到