導語
在我們生活的年代,博客並不稀奇,甚至可以說是隨處可見。從最早的搜狐、新浪博客,再到每個人都曾記錄青春的 qq 空間,再到現在的 vlog 與 plog,似乎擁有一個自己的博客並不是什麼難事。然而想要自己從零開始搭建一個出色的博客系統,則並非那麼簡單。可能有些懂技術的小夥伴會說,看上去只是簡單的對文章 crud 就行了,也沒有那麼複雜啊。然而,真的是這樣嗎,這背後可能隱藏著更多玄機等待著我們去挖掘。掐指一算,我建設自己的博客已有 11 年,也見過許多程式設計師自己編寫博客系統,但真正按規範和標準設計的功能完備的博客少之又少。本文我將分享自己在博客系統設計中積累的經驗,居間一些鮮為人知的博客技術,幫助想要搭建博客的小夥伴們進一步了解如何設計一個優秀的博客系統。
目錄
由於文章篇幅較長,本文將分為 4 篇推送,目錄如下:
- “博客”的前世今生
- 我的博客故事
- 誰是博客的受眾?
- 博客基本功能設計要點
- 4.1文章(post)
- 4.2評論(comment)
- 4.3分類(category)
- 4.4標籤(tag)
- 4.5歸檔(archive)
- 4.6頁面(page)
- 4.7訂閱
- 4.8版本控制
- 4.9主題及個性化
- 4.10用戶及權限
- 4.11插件
- 4.12圖片及附件的處理
- 4.13髒詞過濾及評論審查
- 4.14靜態化
- 4.15通知系統
- 博客協議或標準
- 5.1 RSS
- 5.2 ATOM
- 5.3 OPML
- 5.4 APML
- 5.5 FOAF
- 5.6 BlogML
- 5.7 Open Search
- 5.8 Pingback
- 5.9 Trackback
- 5.10 MetaWeblog
- 5.11 RSD
- 5.12閱讀器視圖
- 設計博客系統有哪些知識點
- 6.1時區真的全用 utc?
- 6.2 html 還是 markdown
- 6.3 mvc 還是 spa
- 6.4安全
- 結束語
“博客”的前世今生
博客一開始不叫 blog,而叫 weblog,可能讓很多人詫異的是,它並不誕生於 web 2.0 時代,而是早在 1997 年已經問世。博客從最早的單用戶(單獨作者),逐漸發展為多用戶(一個團隊),即博客平台。而 web 2.0 時代賦予了博客社交屬性,可以讓讀者進行評論、訂閱(rss/atom),博客作者之間可以互相抱團(foaf)、引用文章(pingback),才讓博客逐漸熱門了起來。
博客系統也是各有千秋,php 有 wordpress,.net 有 blogengine。而最終,wordpress 幾乎成為了事實上的博客系統的標準,它同時具備一些 cms 的功能,微軟官方 .net 團隊的博客也是採用 wordpress 搭建。

閱讀博客的用戶除了使用瀏覽器,還會使用 rss/atom 閱讀器。在 ipad 剛出來的年代,閱讀器應用曾經風靡一時。訂閱的博客一旦有新文章,閱讀器就會自動收入,讀者無需每天人肉檢查是否有新文章發布。microsoft 365 的 outlook 至今保留著 rss 閱讀器的功能。
博客至今依然是表達自我、傳播信息並與社區互動的最佳途徑之一,就算微博(microblogging)出現,也沒能使博客變得不再流行。所以說,博客之於網際網路,就如同電子郵件一樣,“薑還是老的辣”,博客作為一種文化載體,歷久彌新,持久散發著光芒。
我的博客故事
我的博客項目最早可追溯到 2003 年,那時候我正在上初中,課餘時間自學了 asp 及 access,構建了我的第一個個人網站,主題居然是黑客技術(年少無知,以為非常酷炫)。除了原創及轉載技術文章,也提供常用軟體工具下載等服務,有時候還假裝大學生幫人完成 asp 的畢業設計(畢竟說自己是初中生沒人會相信)以換取 q 幣、qq 秀等(太有年代感…)。這個系統一直維護到 2007 年我上高二,它長這樣:

高考之後,我終於有大量的時間學習自己想了解的技術,且不用擔心被家長埋怨不好好學習。那會我自學了 asp.net(vb),構建了我的第二代個人網站,主題不再是黑客技術,而是常規的計算機技術分享,主打原創技術文章(日誌),同時也開發了相冊、播客等 sns 功能,並於 2009 年上線,它長這樣,一直維護到 2011 年。

2012 年畢業以後,我當了一名工程師(程式猿),沒有精力維護軟體下載、相冊和播客等欄目,於是決定只做技術文章,大刀闊斧地改版了我的網站,博客的雛形就出來了。為了構建博客,我參考了同樣是 .net 的 blogengine 項目。其實國內某著名的 .net 博客平台,最早就使用了 blogengine 項目,甚至它當年還有箇中文版,叫博易。不過與其直接魔改他人的項目,我選擇看懂代碼以後,自己用不同的方式去實現。本文之後要居間的許多內容也來源於這段時間的學習。

毕业 7 年后,发现各项技术发展迅猛,.NET 技术与其他主流技术的竞争非常激烈,而长期在外企的我主要运用的还是 .NET 的技术。此时我下定决心,在业余时间里,用 .NET Core 重写我的博客系统,命名为 Moonglade,并开源到 GitHub(https://github.com/EdiWang/Moonglade)目前博客地址是 https://edi.wang。内容面向国外社区,部署在微软 Azure 的海外服务器上(国内访问可能较慢)。

刨除初中時代牛刀小試的 asp 不說,從 2009 年到 2020 年這 11 年間,我的博客代碼橫跨十幾年 .net 發展歷程,從 asp.net webform 2.0 vb.net + access 到現在的 asp.net mvc core, c# 8 及 azure sql database,也整合了 azure app service、azure dns、azure devops、azure active directory、azure blob、azure ad、azure cdn 和 application insights 等技術。

誰是博客的受眾?
在談設計博客之前,我們首先要明確,你的讀者從何而來?搞清楚這一點後,才能夠聯想出用戶將如何使用你的產品。這也正是本文所要居間的博客的設計方法和要點。
开发和运营博客 11 年的经验积累和数据统计告诉我,对于一个常规技术博客,95%以上的流量来自于搜索引擎,并且多数情况下读者只查看这一篇他们所需要的文章,固定读者或订阅用户占总流量的比例相当少。这是由于技术博客分享的内容多数为解决一个具体的技术问题。而技术人员遇到技术问题的第一反应就是去搜索引擎查找有没有人曾经遇到过并已经解决,有可能复制粘贴文章里的代码去解决自己项目里的问题后,就忘记了博主的存在。只有真正觉得博主的文章有一定水平,才会开始浏览博客里的其他内容。
不难发现,我们的用户入口几乎就是搜索引擎,所以一个优秀的博客系统,并不是只做好文字功夫,需要大量考虑SEO及其他针对机器和系统之间交互的博客协议,时刻考虑SEO也是贯穿本文的重点。
本文並不教大家代碼的設計、技術實現,而是教大家博客系統的設計思路和要點。至於技術方面,大名鼎鼎的 wordpress、前輩們的 blogengine.net,以及我的 moonglade,目前都已開源的,可供大家隨時研究。
下篇我將居間【博客基本功能設計要點】
敬請關注
