登录
  • 人们都希望被别人需要 却往往事与愿违
  • 如果调试(debug)是去除bug的过程, 那么编程就是制造bug的过程@Edsger Dijkstra (图灵奖得主)

我和Nginx二级目录rewrite、Jekyll、Typecho的故事

不知所云 Benny小土豆 2557次浏览 1899字 10个评论
文章目录[显示]
这篇文章在 2017年07月11日16:48:45 更新了哦~

几天前小蜗牛童鞋决定从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什么的。
所以总结就是,做好统筹规划工作,然后再干事吧!耶!


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://www.bennythink.com/nginx-jekyll-typecho.html
喜欢 (3)
分享:-)
Benny小土豆
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(10)个小伙伴在吐槽
  1. 土豆老师,向您请教个问题! 我全新安装的typecho,安装在根目录下的/typecho/下,遇到个问题,如何直接访问域名就能访问到这个typecho程序,而不是*.com/typecho/,这样的路径呢?
    波罗2017-12-21 08:58 回复
    • Benny小土豆
      最简单 的办法,直接给移动到根目录就好啦
      Benny小土豆2017-12-21 09:00 回复
      • 如何依然想把typecho放在子目录下,但又想直接正常访问域名,有办法指导下吗
        波罗2017-12-21 09:34 回复
        • Benny小土豆
          这……好吧。写这么一条rewrite试试rewrite "^/typecho$" https://$host permanent;,访问www.example.com/typecho时会跳到www.example.com
          Benny小土豆2017-12-21 09:56
  2. 去年从wordpress迁移过typecho,用的官方插件。 1.代码高亮会丢失,需要每篇文章都重新用markdown标记一下。 2.七牛云的图片会丢失,不太清楚放在本地的会不会,换typecho后才发现,一两个月才更新一次,上个毛的七牛云。 其他的没什么了,官方的插件迁移的时候是迁移的html语句,不会格式化为markdown。
    守夜人2017-04-08 00:34 回复
    • Benny小土豆
      哈哈,选择好环境了就不要来回变嘛!尤其是不支持md的和支持md的,会太酸爽!
      Benny小土豆2017-04-08 08:23 回复
  3. 入了WordPress的坑(那时还不怎么用Markdown和LaTex),几次想换Typecho不成功 :sad:
    劲腾2017-03-30 17:42 回复
    • Benny小土豆
      Typecho确实够简洁,我近期也在着手改一个Typecho主题。我记得貌似有插件可以导入WordPress文章的呀。
      Benny小土豆2017-03-30 17:43 回复
      • 官方的那个 Wordpress转Typecho 的插件版本比较旧,没敢用 :evil:
        劲腾2017-04-01 10:01 回复
        • Benny小土豆
          :mrgreen: 拿个马甲站做测试!
          Benny小土豆2017-04-01 10:03