对本站的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>
终于大功告成!