上篇《博客系统知多少:揭秘那些不为人知的学问(二)》介绍了博客的基本功能设计要点,本篇介绍博客的协议或标准。
目錄
由於文章篇幅較長,本文將分為 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安全
- 結束語
5.1丨 rss
rss(really simple syndication)是一種基於 xml 的標準,普遍應用於包括博客在內的內容類網站,由 dave winer 於 1999 年發明,少年計算機天才 aaron swartz 參與定義規範,可惜後者於 2013 年 1 月自殺,年僅 26 歲。
rss 也是博客系統中最有標誌性特性之一,其在博客中的應用廣泛度成為了事實上的標準,沒有 rss 的博客系統就像看到不帶攝像頭的手機一樣有趣。
rss 文件的擴展名可通常是 .rss 或 .xml,也可以不定義拓展名(如 moonglade 的 rss)。內容為近期發表的博客文章的 xml 描述,包括標題、時間、作者、分類、摘要(也可以是全文)等信息。

rss 是寫給機器看的,可用於網站之間同步內容,例如當年人人網(前校內網)可通過 rss 導入博客文章為日記。而對於普通用戶,則需要 rss 閱讀器應用來訂閱博客。通常這樣的閱讀器里不止訂閱一個作者的博客,而是該用戶關心的所有博客。閱讀器通常也是跨平台、跨設備的,用戶可以在電腦、平板、手機,甚至樹莓派上訂閱 rss 源。


部分瀏覽器(如早期的火狐)也可以自動識別一個博客的 rss 地址,並在瀏覽器中訂閱。其自動發現原理是查找網頁 head 中有沒有這麼一個東西:
<link rel="alternate" type="application/rss+xml" title="Edi Wang" href="/rss" />
但是 RSS 有个缺点,它并不能够由服务器主动向客户端推送,而需要靠客户端自动去服务器拉取。而过去 10 年中,随着移动端的兴起,消息推送服务弥补了 RSS 的不足,各大平台也几乎都推出了自己的手机 APP,因此 RSS 已经被许多网站淘汰。但并不意味着 RSS 没用了,至今仍有大量网站仍然提供 RSS 订阅。例如微软 Channel 9 电视台的 RSS: https://channel9.msdn.com/Feeds/RSS/,国内的博客园的 RSS:http://feed.cnblogs.com/blog/sitehome/rss,有意思的是博客园网站的 logo 其实就是个 RSS 图标。
對於構建博客系統而言,你通常不會再專門做個手機 app,用戶也不會為每一個博客都單獨下載一個 app,並且博客系統與其他博客、網站之間依然需要同步,不可能為每個合作夥伴都開發一套同步協議,大家依然都用已經是公認標準的 rss,因此 rss 在 2020 年依然是博客系統推送文章的最佳途徑。
参考:https://en.wikipedia.org/wiki/RSS
5.2丨 atom
atom 和 rss 的作用幾乎一樣,但 atom 的出現是為了彌補 rss 的一些設計缺陷。例如對於文章發表日期,atom 採用 rfc 3339 的時間戳,而 rss 採用的是 rfc 822 標準。atom 也可以標識文章的語言、允許 payload 中出現 rss 不允許的 xhtml、xml 和 base64 編碼內容等。
許多博客系統(包括我的 moonglade)同時提供 rss 及 atom 源。
参考链接:https://en.wikipedia.org/wiki/Atom_(Web_standard)
5.3丨 opml
“opml(概述處理器標記語言)是用於輪廓的 xml 格式(定義為“一棵樹,其中每個節點包含一組具有字符串值的命名屬性” )。它最初由 userland 在其 radio userland 產品中作為大綱應用程式的本機文件格式開發,此後已被用於其他用途,最常見的是在 web feed 聚合器之間交換 web feed 列表。
opml 規範將大綱定義為任意元素的層次結構,有序列表。該規範相當開放,因此適用於多種類型的列表數據。
mozilla thunderbird 和許多其他 rss 閱讀器網站和應用程式都支持以 opml 格式導入和導出 rss feed 列表。”
参考:https://en.wikipedia.org/wiki/OPML
通俗易懂的說,opml 對於博客來說,就是告訴閱讀器,這個博客一共有哪些訂閱源以及他們各自的訂閱地址,通常就是每個文章分類是一個訂閱源,全部文章又是一個訂閱源。

5.4丨 apml
apml 即 attention profiling mark-up language,它比 opml 更鮮為人知。apml 目前在網際網路上已經非常少見了,比 wp 還慘。作為博客行業的歷史遺蹟之一,抱著情懷簡短居間一下。
與 opml 類似,它也是一種 xml 格式的聲明文件,用來描述個人感興趣的事物或話題,並分享給其他讀者或博主,以幫助閱讀器或者博客系統本身針對用戶感興趣的內容提供服務或更有針對性的廣告。
参考链接:https://en.wikipedia.org/wiki/Attention_Profiling_Mark-up_Language
wordpress 可以通過插件實現 apml,blogengine 則自帶 apml,我的 moonglade 不支持 apml。
5.5丨 foaf
foaf 即 friend of a friend,也是個寫給機器看的文件,描述了一個人類的社交關係,通常在博客中可以用 foaf 表示博主和其他博客之間的 “友情連結” ,只不過這個友情連結是寫給機器看的。好讓機器明白,誰才是你的基友,從而給讀者推薦基友博客里的內容。
wordpress 可以通過插件實現 foaf,blogengine 自帶 foaf,我的 moonglade 不支持 foaf。foaf 和 apml 的現狀差不多,已快絕跡。
参考链接:https://en.wikipedia.org/wiki/FOAF_(ontology)
5.6丨 blogml
blogml 是一套跨博客系統的數據標準,凡是實現了 blogml 的博客系統,就算語言、平台不一樣,也都可以互相導入、導出文章等數據。就好比 html5 是個標準,edge、chrome、firefox 是瀏覽器,只要針對 html5 寫的網頁都能跨這些瀏覽器運行。
blogml 也誕生於.net 社區之中,隨後發展成了標準。除了本身就是.net 的 blogengine 等系統以外,php 寫的 wordpress 都支持 blogml。當年支持 blogml 的還有 windows live spaces,subtext,dasblog 等。我的 moonglade 不支持 blogml。
當前 blogml 的標準 schema 是 2.0,更新於 2006 年 11 月 25 日。看起來這個標準也已經……
参考:https://en.wikipedia.org/wiki/BlogML
5.7丨 open search
如果博客實現了 open search 規範,那麼博客的搜索功能就能夠自動整合到用戶的瀏覽器里,從而便於用戶直接在瀏覽器地址欄使用你博客的搜索服務作為搜尋引擎(就像必應、谷歌那樣)。

實現 open search 只需兩步,首先在網頁的 head 里加入指向 opensearch 定義文件的 link
<link
type="application/opensearchdescription+xml"
rel="search"
title="Edi Wang"
href="/opensearch"
/>
然後輸出 opensearch 文件即可
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Edi Wang</ShortName>
<Description>Latest posts from Edi Wang</Description>
<image height="16" width="16" type="image/vnd.microsoft.icon"
>https://edi.wang/favicon.ico</image
>
<Url type="text/html" template="https://edi.wang/search/{searchTerms}" />
</OpenSearchDescription>
文件描述了博客的名稱、簡介、圖標以及搜索內容的 url pattern。瀏覽器一旦識別這個文件,會自動將你的博客註冊到搜尋引擎列表里去。然後讀者就可以直接在瀏覽器地址欄里搜索關鍵詞,並顯示博客自己的搜索結果頁面。


Open Search 的具体规范和标准可参考:https://en.wikipedia.org/wiki/OpenSearch
5.8丨 pingback
pingback 用於博客系統之間通訊,一旦自己的文章被他人引用就會收到 pingback 請求,而自己引用了他人的文章就會向對方博客發送一個 pingback 請求,因此完成一次 pingback 需要己方和對方的博客共同支持 pingback 協議。由於是標準協議,所以 pingback 並不要求雙方的博客使用同一款博客產品,例如我用.net core 寫的 moonglade 可以完美和 php 寫的 wordpress 互相 ping。pingback 也並不限制網站類型一定得是博客,任何 cms 或內容網站想要支持 pingback 都沒問題。
pingback 的技術原理也不複雜。
發送 pingback 請求:
得到自己文章的 url a、對面被引用文章的 url b,請求 b,看看它有沒有 pingback 終端,如果有,構建一個 http request,內容是一段 xml:
<methodCall>
<methodName>pingback.ping</methodName>
<param>
<param><value><string>A</string></value></param>
<param><value><string>B</string></value></param>
</param>
</methodCall>
這樣 b 所在的網站就知道 a 文章引用了 b 文章,處理 pingback 後,會給 a 所在的網站一個成功與否的響應。

接受 pingback 請求:
自己的文章 url a 被他人文章 b 引用,並收到了一個 pingback xml。首先自己要驗證別人的 pingback 請求長得是否奇怪,以保證安全性,例如有沒有正常的 methodname、有沒有合法的雙方 url、url 是否能正常訪問、是否有奇怪的 url(例如 localhost 或有潛在攻擊行為的特殊構造)。保證 pingback 請求沒問題後,請求 b 的頁面,抓取 b 網頁的 title 內容、b 的 ip 地址,記錄到自己的資料庫中,並和 a 文章關聯。
收到的 pingback 通常以系統身份自動在文章下加評論,但這個設計不是規範之一,你可以自由發揮,例如 moonglade 把 pingback 集中起來在後台給博客管理員查看。

参考:https://en.wikipedia.org/wiki/Pingback
5.9丨 trackback
trackback 允許一個網站將更新通知給另一個網站。這是網站作者在有人連結到其文檔之一時請求通知的四種類型的連結方法之一。這使作者可以跟蹤誰連結到他們的文章。
参考:https://en.wikipedia.org/wiki/Trackback
儘管功能和 pingback 類似,但 trackback 通常需要手工發送,並需要給對方提供一篇文章的摘要。而 pingback 的過程是又雙方博客系統共同完成的全自動操作。
5.10丨 metaweblog
metaweblog 是一套基於 xml-rpc 的 web service,這套 api 定義了幾個標準接口,用於文章、分類、標籤等博客常規內容的 crud。只要實現了這些接口的博客系統,就可以讓博主不用通過瀏覽器登錄博客後台寫文章,而使用計算機上安裝的客戶端去寫博客。主流的客戶端包括 windows live writer、microsoft word。在客戶端里可以完整的編輯文章、插入圖片、設置分類,甚至可以將博客的主題同步到客戶端中。
可能它看起來也像是過時的博客協議之一,但直到 2020 年的今天,最新版的 microsoft 365 套件依然完整支持實現了 metaweblog api 的博客系統。

類似 metaweblog 的博客 api 還有 blogger api, atom publishing protocol, micropub。
参考:https://en.wikipedia.org/wiki/MetaWeblog
我的博客在 2012 年曾經 996 007 完整實現了 metaweblog + rsd,但如今 30 歲了,在.net core 里暫時不打算實現這個了,畢竟有多少人還在用 live writer 和 word 寫博客(哭。
5.11丨 rsd
really simple discovery(rsd)是 xml 格式和一種發布約定,用於使博客或其他 web 軟體公開的服務可由客戶端軟體發現。這是一種將設置編輯/博客軟體所需的信息減少到三個眾所周知的元素的方法:用戶名,密碼和主頁 url。任何其他關鍵設置都應該在與網站相關的 rsd 文件中定義,或者可以使用提供的信息來發現。
為了使用 rsd,網站的所有者在首頁的 head 里放置了一個連結標記,用於指示 rsd 文件的位置。mediawiki 使用的一個示例是:
<link
rel="EditURI"
type="application/rsd+xml"
href="https://en.wikipedia.org/w/api.php?action=rsd"
/>
然後用 rsd 文件去表示各種 api 的接口
<?xml version="1.0"?>
<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
<service>
<apis>
<api name="MediaWiki" preferred="true" apiLink="http://en.wikipedia.org/w/api.php" blogID="">
<settings>
<docs xml:space="preserve">http://mediawiki.org/wiki/API</docs>
<setting name="OAuth" xml:space="preserve">false</setting>
</settings>
</api>
</apis>
<engineName xml:space="preserve">MediaWiki</engineName>
<engineLink xml:space="preserve">http://www.mediawiki.org/</engineLink>
</service>
</rsd>
参考:https://en.wikipedia.org/wiki/Really_Simple_Discovery
rsd 也幾乎和上面的 metaweblog 接口一起使用。這樣 windows live writer、microsoft word 等工具才可以自動發現博客的 metaweblog 服務,而不需要手工去輸 url。
5.12閱讀器視圖
大部分瀏覽器和客戶端都有閱讀器視圖,可以讓讀者在與博客網站頁面風格完全不一樣的視圖中閱讀文章。例如,我博客某篇文章的正常頁面長這樣:

瀏覽器識別到我的博客支持閱讀器視圖,就會亮起沉浸式閱讀按鈕

進入沉浸式閱讀界面後,瀏覽器會自動提取文章的內容,識別文章的標題、章節、圖片,去掉導航欄、側邊欄等與文章無關的元素,並可讓用戶控制文本大小、背景色,甚至朗讀文章內容。

不僅我的博客有閱讀器視圖,設計良好的博客、新聞內容站都有,例如 azure 的:

另外,支持閱讀器視圖的網站,seo 一定不會差。因此設計博客系統時,請考慮支持閱讀器視圖。
下篇將主要居間【設計博客系統有哪些知識點】歡迎關注
