对本站的url做了升级,由自增的数字url升级成了字符串url

所属分类:网站建设 | 发布于 2023-05-22 00:05:32

本站原来的url地址是这样的:https://wenge365.com/a/125.html

升级完成后这篇文章的地址是这样的:https://wenge365.com/a/akwwMmNxZ3dveWgzMWJiVWV0ZHBFQT09.html

就是将自增的数字类型转换成了32位的字符串。

数字和字符串互转可以看这篇文章:https://wenge365.com/a/QW5pTXh0VFB6eG9LMktiTUJKbWxLUT09.html

这样做的好处是可以防止有人在浏览器直接输入数字拼凑出url地址然后直接进行访问,虽然目前应该也没有人对我这个小站点这样做。转换成字符串url后,就几乎不能靠规律猜测出文章的url地址了,感觉良好,这算是一个程序员的心理安慰吧。

来说一下实现步骤

1、配置数字和字符串互转的key和iv

"app_number_secret" => [
        // key 32位的字符串
        'secret_key' => "xxxxxxxxxxxxxxxxxxxxxxxx......",
        // iv, 16为的字符串
        'secret_iv' => "yyyyyy......."
    ],

2、引入intToString和stringToInt这两个函数

详情见上面提到的数字和字符串互转的文章。

3、路由规则修改

之前的路由规则是这样的

Route::rule('a/:id', 'article/ArticleDetail')->pattern(['id'=>'\d+']);

然后再增加一条

Route::rule('a/:stringId', 'article/ArticleDetail')->pattern(['stringId'=>'\w+']);

这条是识别字符串Id的,之前的数字路由不去掉是为了兼容搜索引擎,虽然目前没什么访问量,毕竟还是有收录的,之前被搜索的数字url链接会进行301永久重定向,这个等下会提到。

4、控制器修改

4.1、要获取文章详情最终还是要拿到文章id,之前的控制器是这样拿到id的

$id = input('param.id');

4.2、在新规则下需要这样拿到id,也就是讲字符串id转成数字id

$stringId = input('param.stringId', '');
$id = stringToInt($stringId);

4.3、为了对搜索引擎友好,也就是兼容以前的url,则需要对搜索引擎过来的数字id的url进行301重定向处理,让它重定向到新的规则上面。

$id = input('param.id');
if ($id) {
    return redirect(url('article/articleDetail', ['stringId'=>intToString($id)]), 301);
}

4.4、为了让新的文章不能使用数字id地址进行访问,则需要添加一个判断,当数字id大于某一个值时就不能访问了,也就是这篇文章只能用新的规则进行访问,不能使用数字id访问了,所以最终的代码是这样的

$id = input('param.id');
if ($id) {
    return redirect(url('article/articleDetail', ['stringId'=>intToString($id)]), 301);
}

if ($id) {
    if ($id > 130) {
        return $this->http404();
    } else {
        return redirect(url('article/articleDetail', ['stringId'=>intToString($id)]), 301);
    }
}

$stringId = input('param.stringId', '');
$id = stringToInt($stringId);

// 获取文章详情
// ........

5、修改视图的url生成函数

之前视图的url生成是这样的

<a href="{:url('article/ArticleDetail', ['id'=>$item.id])}">{$item.title}</a>

修改之后就是这样的

<a href="{:url('article/ArticleDetail', ['stringId'=>intToString($item.id)])}">{$item.title}</a>

终于大功告成!

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接