几天前小蜗牛童鞋决定从 Jekyll 回到 Typecho,好像也没啥大不了的。好在这俩都是支持 markdown 的,笨方法就是复制粘贴手动处理下。
于是乎很快的上了 HTTPS+HSTS+HSTS Preload List,随后不久发现问题来了。
在 SEO 上有这么个问题,原来的 url 都是形如http://mingyueli.com/cn/2016/11/03/python-backup-script/
这样的,但是现在对应的 URL 却是https://www.tougetu.com/2016/11/python-backup-script.html
我们仔细观察下能发现,现在多了个www
,少了个cn
,少了个日期,最后少了个/
多了个.html
原来的 URL 模式下 Google 已经收录了一些,现在的也收录了好些(好像是今天一天爬的),但是现在访问原来的 URL 会 404,蜘蛛怎么会喜欢 404 呢?所以作为一个有灵性的码农,咱自然要处理下这个问题。我想了这么几个方案:
1. 原来的 url 管他什么的,就跳转到现在的主页;
2. 对现在的永久链接格式进行一点修改,给加上日期这一行;
3. 把原来的 url 完美跳转到现在的模式
1. 直接跳转主页
第一个最简单了,直接在mingyue.com.conf
中 server 段加个rewrite ^/cn/(.*)/$ https://www.tougetu.com/;
就可以了。这样的话管他是啥样的,都给定向到首页了。 这样对搜索引擎倒是没太大事,但是访客们可能就懵逼了,我要看的博文咋变成首页了?通常来说大部分人在大部分情况下就会选择关闭了。
2. 更改永久链接并跳转
第二个方案需要进入 Typecho 后台,将永久链接(也就是固定链接啦)改成/{year}/{month}/{day}/{slug}.html
,rewrite 规则如下:
- rewrite ^/cn/(.*)/$ https://www.tougetu.com/;
访客们倒是能被重定向到对应的新博文,但是这样对 SEO 就有一些影响了,毕竟 Google 已经爬了好些,咱再改永久链接不好啊。
3. 完美的解决方案
第三个方案则是最好的,rewrite 规则如下:
- rewrite "^/cn/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)/$" https://www.tougetu.com/$1/$2/$4.html;
这样蜘蛛们也看不到 404,访客们又能被重定向到新的正确的地址下。
头一次体验到了/etc/init.d/nginx reload
是多么的有用
后续总结与思考
我对 Nginx 的了解也不多吧,但是通过这次,我至少知道了一点点 rewrite 的写法,下面总结一下备忘并分享给可能遇到了一样坑爹问题的童鞋们吧!
rewrite 语法:rewrite regex replacement flag
第二个 regex 是正则表达式,第三个是替换之后,第四个是标志,有这么四个
1.last 相当于 apache 里面的 [L] 标记,表示 rewrite。
2.break 本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3.redirect 返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址。
4.permanent 返回 301 永久重定向, 浏览器地址会显示跳转后的 URL 地址。
在正则中如果需要使用 {} 则需要用双引号或者是单引号把正则扩起来(因为 nginx 中 {} 标志着块的结束和开始)
所以,上面我这一串正则^/cn/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)/$
含义就是:
匹配 / cn / 开头的、0 到 9 数字出现四次、/、0-9 数字出现 2 次、/、0-9 数字出现两次、/、任意字符、/ 结尾
再看下我们原始的 URL
http://mingyueli.com/cn/2016/11/03/python-backup-script/
非常恰当的匹配上了,然后 $1 的含义就是第一对 () 中的内容,$2 的含义就是第二对(),依此类推…… 所以 $1/$2/$4 也就对应这 2016、11、 python-backup-script,组合起来也就是2016/11/python-backup-script.html
,于是任务就结束咯。
当然这样也有一些还是无法处理,比如说后来自己改了 url 的…… 本大神虽说很厉害,但是这样也是很无奈的呀!
所以说啊,学好正则简直太重要了嘛!正则表达式无处不在嘛!不会正则好意思说自己是用 Linux 的嘛,是吧。
想当初我换域名和换二级目录的时候,我也是这么折腾过,只不过那时候不会用 rewrite 什么的。
所以总结就是,做好统筹规划工作,然后再干事吧!耶!
rewrite "^/typecho$" https://$host permanent;
,访问 www.example.com/typecho 时会跳到 www.example.com