解决美化博客文章 url 后遗留的旧形式链接访问问题
由于博客的服务器快要到期了,不打算续期了就迁移到别的服务器。由于早前知识匮乏没打理博客文章的永久链接,所以“导致”文章的链接形如:https://blog.ibills.cn/?p=138
(WordPress 的默认链接形式)。这次迁移就打算美化一下链接,变成形如:https://blog.ibills.cn/p/138
。但是之前的文章链接已经被搜索引擎索引了(虽然文章很少),也有被别的网站引用了,为了不影响旧链接的正常访问打算用 web server 来做一下 301 永久重定向。
rewrite
搜索引擎搜索出来的网络上大部分文章介绍的都是 web server 将路径(即 url 的 path 部分)重写(rewrite)为查询字符串(QueryString)的形式达到美化 url 的目的且不影响 server 端代码解析查询参数,例如:
/arg1/foo/arg2/bar
重写为:
?arg1=foo&arg2=bar
而我的需求是匹配查询字符串形式的链接重定向到路径形式的链接,而 rewrite
貌似只对 url 的路径部分起作用(只匹配路径,不匹配查询字符串),所以这个需求可能不能用 web server 的 rewrite 功能来处理。
解决需求
为了满足这个需求,进行了一些探索,最终通过 web server(nginx) 的 if 指令来匹配查询字符串,通过 return 指令来实现 301 永久重定向:
if ($args ~* "^p=([\d]+)$") {
return 301 /p/$1;
}
$args
变量,它的值包含完整的查询字符串参数及其对应的参数值,如 arg1=foo&arg2=bar
。如果你想获取其中一个参数的值可以使用形如这样的变量名:$arg_name 获取,其中 name 是查询字符串参数的名称,如本需求使用 $arg_p
可以取到查询字符串参数 p 的值,即 138。关于 nginx 的 $args
变量可以查看官方的文档。
小插曲
在探索这个需求的时候出现了点小插曲,修改 nginx 的配置文件后老是不起作用,最后发现是改错了文件,改的是另外一个配置文件,着实令人丧气。。
小贴士
- 修改完配置文件记得使用命令
nginx -t
检查一下是否有语法错误,在 ningx 配置中 if 指令后面要留一个空格,这是遇到的其中一个“坑”,否则会报未知指令(unknown directive)错误; - 修改后记得使用命令
nginx -s reload
平滑载入新的配置文件使其立刻生效; - 记得不要改错配置文件了!~_~;
- 必要时,修改前记得备份一下原配置文件。
好了,你可以点击以下文本链接体验一下效果:
https://blog.ibills.cn/?p=139