博客系统知多少:揭秘那些不为人知的学问(二)
點擊上方關注“汪宇杰博客”
上篇《博客系統知多少:揭秘那些不為人知的學問(一)》介紹了博客的歷史、我的博客故事及博客的受眾來源。本篇精彩繼續,介紹博客基本功能設計要點。
1.“博客”的前世今生
2.我的博客故事
3.誰是博客的受眾?
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. 博客協議或標準
????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. 設計博客系統有哪些知識點
??? 6.1 時區真的全用UTC?
????6.2 HTML還是Markdown
????6.3 MVC還是SPA
????6.4 安全
7. 結束語
0
1
文章 (Post)
我們每天可能都會閱讀或長或短的3-5篇文章。文章是博客系統的核心業務,因此博客文章的內容和質量非常重要。
那么,文章這個業務類型如何起名?數據庫的表名和代碼的變量名,類型名稱用article嗎?好像上學時候只學過文章叫做article。其實博客類型的文章,正確的表達是post,英文單詞里post和article的區別在于,post只是隨心所欲寫的文章,而article指的是論文那樣的經過精心雕琢,旁征博引,并且有可能在學術期刊上發表的文章。因此設計博客系統的時候,盡量避免使用article這個單詞來命名代碼。更具體來講,post中可以出現不嚴謹、口語化的表達方式,例如本文就算是個post。而article講究言語上的規范,連 “讓我們” , “我們來看看” 這種字眼都不能出現。
圖 | 網絡
文章需要具備標題、Slug、創建時間、發布時間、修改時間、摘要和內容等要素,也會包含所屬分類、標簽、閱讀量和點贊量等次要信息。其中Slug是博客的特色,它指的是一篇文章的URL。例如我的文章:《Try the New Azure .NET SDK》,它的URL為 https://edi.wang/post/2019/12/5/try-the-new-azure-net-sdk,其中try-the-new-azure-net-sdk即為該文章的Slug。Slug講究的是“人類可讀”,一般情況下均為博客標題對應的英文表達,用中劃線分割英文單詞,Slug也對博客的SEO起到了關鍵作用。如果你的博客文章用的是數據庫ID、文章標題的HTML Encoding等做URL,請更換為Slug。特別是遇到中文文章,如果標題被URL Encoding了,那么對于SEO和鏈接分享,都是災難。一個Slug一旦定下,盡量不要改動,雖然大部分博客系統都支持修改Slug,但是對于被搜索引擎收入的文章,改了Slug就會導致404。比較完備的博客系統(如WordPress)支持采用301重定向方式告訴搜索引擎原文地址已變化。
摘要有兩個作用,一是用于在列表視圖中顯示文章信息預覽,二是用于SEO,放在description這個meta標簽中,可以幫助搜索引擎精準定收入的內容。對于中文內容,需要注意是否輸出的HTML源代碼被Encoding過,ASP.NET Core默認的Encoding會對SEO造成災難(我的博客系統因為面向英語用戶,不考慮中文支持,所以并不解決這個問題)。
(圖:文章列表中的摘要)
(圖:meta description標簽代碼)
摘要可以自動抓取文章前幾百字,也可以像微信公眾號那樣要求用戶手工填寫。我的博客采用的是自動取文章前400字。結合SEO的關系,我的文章通常開頭段落就是概要,這樣可以讓用戶在搜索引擎預覽頁面就能看到準確內容,而不是頁面上無關緊要的UI元素。
(圖:必應搜索引擎識別的內容摘要)
文章的狀態通常包括:草稿、發布、回收。用戶僅能看到已發布的文章,管理員可在后臺更改文章狀態。
0
2
評論(Comment)
評論是博客中作者和讀者互動的主要方式。有些博客要求讀者登錄后才能發表評論,而有些可以允許游客評論(比如我的博客及WordPress)。登錄的好處在于可以識別你的讀者,并有效防止垃廣告評論。但要求登錄也會給用戶造成操作上多了一個步驟,嫌麻煩的用戶就不會進行評論。
我的博客及WordPress默認都設計為需要管理員在后臺審核評論后,才能放出顯示。這也能有效避免垃圾廣告、騷擾信息甚至是一些惡意的煽動性言論。對于提供Email地址的用戶,管理員也能夠在后臺回復用戶的評論,并由博客系統向用戶發送Email通知。
(圖:Moonglade的評論區)
對于技術博客,評論可考慮開放markdown格式。這是一種在程序員之間格外受歡迎的語法,在GitHub得到了廣泛應用。
評論需要采用驗證碼或其他人機驗證技術,以防止機器人發廣告。但根據經驗,驗證碼并不能100%阻止垃圾信息,因為現代化的垃圾信息還真的是人組團發的,有專門的公司、團隊、微信群等,國外也有。于是,你可能需要考慮關鍵詞過濾,購買三方過濾接口等。
評論也得記得做字數限制,不然也有可能會造成部分用戶“灌水”、刷屏的現象。
如果不想自己寫功能,還可以整合三方的評論服務,即博客系統本身不實現評論功能,通過三方服務加載外部JS,在文章閱讀頁面“注入”一個評論區,通常這要求文章的URL不變(WordPress里叫做永久性URL)。
0
3
分類(Category)
像建文件夾一樣將文章根據內容進行區分,即為分類。文章分類后,可以幫助讀者快速檢索同種類的文章。
例如寫.NET、PHP、JS的文章都屬于 “開發技術(Development)”這個分類。而技術圈新聞和職場經驗分享和等文章,則屬于 “工作” 分類,分類的劃分完全由用戶控制。分類可以多對多。例如寫一篇文章介紹了用ASP.NET Core開發Angular應用的文章,可以同時屬于 “.NET技術” 及 “前端開發” 分類。
分類需要一個標題、一個簡介,以及一個路由名稱。例如我博客,微軟云 Azure 的分類,標題為 Microsoft Azure,簡介為? The Best Cloud,路由名稱為azure。標題需要同時顯示在標題欄,以便于SEO。簡介是對于標題的補充說明,便于用戶查看。設計路由名稱的原因請參考下一段介紹的標簽的設計。
(圖:Moonglade博客系統的一個文章分類)
分類的另一個功能就是產生 OPML 及 RSS/Atom 訂閱源,這個將在第五章介紹博客協議中講解。
0
4
標簽(Tag)
一篇文章所提到的話題,即為文章的標簽。和分類一樣,標簽也是多對多關系。標簽可以作為檢索文章的依據,類似關鍵詞,快速查找相關內容的文章。
標簽需要考慮到標簽含義重復的情況,例如:VS和Visual Studio是一個意思,VSCode、VSC和Visual Studio Code也是一個意思。那么用戶選擇標簽的時候,最好使用智能提示推薦用戶使用已有標簽。
對于博客系統設計者來說,還要考慮標簽的URL。如果URL用的是標簽本身的內容,會導致很多問題。當標簽名稱為整個英文單詞,例如Excel,并不會發生問題,因為URL通常是https://yourblog/tags/excel。但是如果標簽內容為 .NET Core、C#、Robots.txt,事情就變的有意思起來。https://yourblog/tags/robots.txt到底是在請求 tags下的robots.txt 文件還是在請求標簽?自己作為博客系統設計者,當然可以從程序上限制所有tags接受的路由參數都為標簽,好像是解決了問題,但SEO和掃描工具可不這么認為,他們有大量by convention的規則會認為是請求文件。
對于需要URL Encoding的標簽內容,更會導致URL缺乏可讀性,從而影響SEO。千萬不要自作聰明地以為現代的搜索引擎可以處理好URL Encoding,一個URL是否干凈對SEO的影響很大。特別是當標簽是中文內容的時候,如果全encoding了,URL就會非常冗長,甚至影響到SEO,也影響到博主分享鏈接。因此,我的博客系統為了處理標簽URL,給每個標簽都設計了規范化名稱(normalized name),由系統根據標簽內容自動產生,如 .NET Core 經過 normalize,會變成 dotnet-core,最終產生的URL即 https://edi.wang/tags/list/dotnet-core。
(圖:Moonglade博客系統的標簽)
對于用戶來說,最容易犯錯之一的就是把標簽用成搜索關鍵詞。例如用戶寫了一篇關于 Visual Studio Code的文章,那么標簽可能會同時打VSCode、VSC和Visual Studio Code,但其實只要選擇一個標簽即可。打太多同樣含義的標簽會導致讀者無法完整檢索到所有相關文章,對搜索引擎來說,也是如此。所以如何用好標簽,是博客設計者和用戶需要共同關注的要點。
標簽云(Tag Cloud)是博客中用來列出最熱門標簽的功能。通常使用跟大號字、更明顯的顏色來標識出對應文章較多的標簽。標簽云可以作為博客博主的個性化屬性,一眼就能看出博主熱衷于什么話題(比如Windows Phone?0.0)。
0
5
歸檔(Archive)
以時間(年、月、日)整理的博客文章即為歸檔,它和分類的區別在于歸檔只以時間為標準來劃分文章。Archive的SEO相對于文章、分類、標簽來說,并不那么關鍵。所以除了URL可以按年月劃分以外,并沒有額外的講究。
例如:https://edi.wang/archive/2019/9 表示2019年9月的文章。https://edi.wang/archive/2019 則表示2019年所有的文章。歸檔功能主要用于給讀者按時間查詢,看看博主某個時間都在干什么。設計這樣的功能可以提高讀者對博主的興趣,也是個人對外形象的一種展示。
(圖:Moonglade博客系統的歸檔)
0
6
頁面(Page)
頁面是博客的可選功能之一,事實上,它更接近于CMS的功能。有些內容并不適合以文章的形式發布,比如“關于”頁面。這樣的頁面通常與發布時候的時間無關,內容也經常更新,排版設計也非常自由,不單純是文字。
頁面通常不需要評論、標簽和分類等屬性,但可以有發布和編輯時間。和文章一樣,頁面也需要注意Slug。
(圖:我博客的關于頁面)
在我的博客系統中,頁面也選擇是否隱藏側邊欄,用戶也可以完全編寫頁面的HTML及CSS代碼,并把頁面添加為導航菜單。WordPress對于頁面的處理更加完備,接近于CMS系統。
0
7
訂閱(Subscription)
讀者訂閱博客的主要方式有Feed(RSS/ATOM)及Newsletter。Feed方式本質上是被動訂閱,需要客戶端軟件發起請求給服務器,檢查是否有新文章發表,才能顯示到客戶端里。Newsletter一般采用Email形式主動發送給訂閱用戶,但這要求博客系統的編寫者實現Email訂閱功能,也要求管理員維護Email服務。訂閱一般只推送近期發表的新文章,例如前10、20篇,而不會每次都推送全部文章導致客戶端爆炸。
(圖:Moonglade的RSS/ATOM訂閱源)
訂閱一般可按文章分類提供,以便于只對某些分類感興趣的讀者閱讀。有些博客系統也提供文章評論的訂閱源,以便讀者觀摩吐槽大會。
關于RSS及ATOM的詳細介紹請看5.1、5.2章節。
0
8
版本控制
更接近CMS的博客系統通常提供版本控制功能,允許用戶回滾文章或頁面的歷史版本。設計版本控制的時候,不能只考慮往前回滾,得還能再滾得回來。通常,用戶每次編輯一篇已經寫好的文章,就會產生一個新版本,類似于git對于一個文件的commit。博客的版本控制也類似于代碼版本控制,你可以選擇保存一篇文章的完整內容作為歷史版本,也可以選擇每次只保存變化量信息(delta)。保存完整內容不容易后續花費大量時間精力 ,但是會占用較多存儲空間。保存內容變化量節省數據庫空間,但實現代碼容易占用大量精力。
0
9
主題及個性化
好用的博客系統通常支持主題,畢竟個性化是博客本身應有的特點之一。WordPress積累了大量的主題庫,也允許自制主題。但是我的博客只支持更改主題色,還有很大上升空間。
1
0
用戶及權限
博客系統分為個人、團隊及博客平臺。個人博客系統一般為單用戶(例如我的博客),不需要設計權限、注冊等功能。多用戶博客則需要實現不同的角色和權限,比如博客管理員、審核專員、撰稿人、評論管理員等等。無論是單用戶還是多用戶博客,集成一套成熟的三方RBAC方案可能是最高效的選擇,多數三方方案也都支持SSO,例如我博客支持的Azure AD。
1
1
插件
插件功能可以在不更改博客代碼的情況下,按需拓展博客的功能。WordPress以及BlogEngine都支持插件,但Moonglade還不行。
(圖:WordPress的插件市場)
1
2
圖片及附件的處理
圖片格式
在2020年,圖片格式已經非常自由,一般的博客JPG居多,程序員的博客PNG居多(畢竟都是屏幕截圖),像微信公眾號那樣采用WEBP格式現在同樣可取,只要讀者的設備兼容即可。一般BMP格式由于體積大會導致網絡傳輸慢,所以不推薦。同樣道理,GIF也要注意限制尺寸。
博客系統輸出圖片時,需要采用正確的Mime Type,以保證客戶端的兼容性。一般直接輸出靜態文件本身不需要博客編寫者手工處理Mime Type,但有專門圖片處理邏輯的博客(例如我的Moonglade)則需要留意保留圖片原本的Mime Type。
圖片水印
給上傳的圖片自動加水印有助于保護版權,水印內容一般是博客的地址或博主名字。添加水印時要注意圖片尺寸調整水印的比例,以免擋住圖中重要內容影響閱讀。對于過小的圖片,可選擇性的忽略水印。
另外,考慮到博客有可能會在發展過程中改名,建議添加水印的時候在系統中保留一份原始圖片,以便于后期更新水印內容。
具體方法可參考我的文章《ASP.NET Core 給上傳的圖片加水印》。
圖片存儲
圖片存哪里是個值得思考的問題。一般有3個地方存放:文件系統、數據庫、云上的Blob存儲服務。Moonglade支持文件系統及Azure Blob存儲。這三者各有優缺點。
文件系統的優勢在于直接serve static file速度最快,但如果圖片目錄本身位于網站目錄底下,會導致目錄不只讀而引起潛在安全問題。比如初中時候很流行的給DVBBS上傳個改了拓展名的ASP web shell,盡管給web服務器上傳可執行文件在2020年已經基本絕跡了,但依然存在隱患,就好比就算你家里請了007當保鏢也是需要夜間鎖好門。
數據庫存圖安全性最高,并且讓博客的數據只位于一個位置,方便管理和備份,十幾年前很流行這么做,但其實讀寫圖片對數據庫有一定開銷,并且再由網站輸出,雙倍開銷,一般不推薦。
而云端Blob存儲服務目前來說是最適合這個時代的方案,將圖片存儲在Blob中不僅能保證服務器目錄只讀,又能采用云本身的安全特性限制非正常訪問,還能通過CDN加速圖片輸出。要硬說缺點,就是云服務需要額外的金錢,而沒錢,是自己的問題,不是云的問題。
圖 | 網絡
圖片防盜鏈
作為網站開發者,我們有時候不希望自己網站的圖片被其他網站直接引用。這在某些場景下會導致自己數據中心里巨大的帶寬消耗,也就意味著別人使用我們的圖片,我們要為此付錢。例如,你的網站是a.com,你有一張圖片是http://a.com/facepalm.jpg,而b.com在他們的網站上使用一個img標簽來引用了你的圖片,這導致網絡請求是進入你的數據中心,消耗你的資源。因此博客可選擇性的啟用防盜鏈功能,具體方法可參考我的文章《ASP.NET / Core 網站圖片防盜鏈》。
? 附 件
通常程序員的技術博客會提供讀者下載代碼樣例等附件。設計附件功能和設計圖片存儲非常類似,完全可行。但我更建議技術博客將代碼示例等附件托管到其他網站(例如GitHub)提供讀者下載。
自己博客實現附件下載的壞處有:
大文件
不同的Web服務器及防火墻產品對文件尺寸的限制不同,而部署博客的用戶很可能無權管理這些限制,就會導致大附件無法提供下載。
域及IP黑名單
某些公司或組織(特別是安全規范較高的軟件公司)會屏蔽非白名單域的文件下載,盡管你可以用瀏覽器正常打開該域的網頁,但無法下載文件(防火墻只允許HTML/CSS/JS等,而不允許ZIP、EXE等)。而程序員博客的讀者很有可能就處在這樣的公司里。
CDN資源耗費
如果你的附件較多,較大,并且你也像設計圖片存儲一樣給附件系統套了個CDN,此時根據CDN服務商計費模式的不同,如果按流量計費,恐怕你的附件下載會導致你的錢包加速瘦身。
而采用三方文件下載(如GitHub、OneDrive)的好處有:
√ 你的文件不僅可以分享到博客文章中,也可以分享到別的位置;
√?這些三方服務有自己的CDN,而不用擔心消耗你自己的錢包;
√?許多文件托管服務有完整的管理功能,例如文件刪除、恢復、版本控制、權限等,要是自己在博客系統里寫一個這個,需要花費大量時間……
1
3
敏感詞過濾及評論審查
博客難免引來一些抱有敵意的人,也會引來發廣告的人,所以通常需要敏感詞過濾和評論審查。如果沒有審查直接將用戶的評論顯示在文章下,那么可能會對博主和網站本身帶來不良影響。例如,有人發了政治敏感的言論或者不合規的廣告,沒有經過后臺審核就直接顯示出來了,而你的博客部署在大陸,那么你的博客很可能會被馬上關停整頓,并且自己也會解鎖程序員從入門到如入獄的成就。也千萬不要以為部署在境外就沒事了,一些仇恨性質的言論甚至可以幫你引來黑客,在你的博客里下毒,勒索你或你的讀者。
圖 | 網絡
因此我強烈建議個人博客啟用敏感詞過濾及評論審查功能。WordPress及我的Moonglade博客系統均支持敏感詞過濾和評論審查。
1
4
靜態化
早期的新聞系統、博客、CMS為了提高大訪問量下的響應速度,都會采用靜態化技術,即將服務端渲染完的頁面保存為真正的HTML文件于磁盤上,進行static file的輸出,Web服務器輸出static file的效率非常高,對于不變的內容,用戶的后續訪問不會hit數據庫,因此極大減小了服務器的壓力。在2020年的今天,靜態化已經不是唯一的方案,Redis Cache也可以幫助我們減少對數據庫的頻繁訪問。對于個人博客來說,如果你的訪問量不高,其實并不需要996一個靜態化或Redis出來增加開發和維護成本。但如果你設計的是博客平臺,那么最好還是用上靜態化或Redis吧。
1
5
通知系統
博客通常通過Email的形式給管理員或用戶發送通知。但是沒有規范或或約定表示博客是否一定得使用Email進行通知推送,可由博客系統設計者自行決定。
通知通常包括:
向博主發送的通知:新評論、文章被他人博客引用(參見第5.8, 5.9章)。
向用戶發送通知:新文章發布(訂閱Newsletter)、評論被回復、評論審核通過或被拒。
Email通知系統要注意垃圾郵件及用戶隱私保護問題。
圖 | 網絡
垃圾郵件發給博主本身問題并不大,但得注意郵件系統是否會允許未經博主許可的針對讀者的郵件發送,其中可能會被人利用發垃圾郵件,從而導致服務器被封禁。有些服務器供應商,例如微軟Azure,對于郵件有更加嚴格的規定,部署在部分PaaS業務上的代碼調用SMTP終端會被直接屏蔽。
對于用戶隱私問題,在用戶向博客系統提供Email地址的同時,需要告知用戶該Email地址會被如何使用(可寫在隱私協議或頁面可見區域),也可以讓用戶勾選是否允許博主使用該Email進行通知推送。另一個問題是郵件地址暴露,這通常發生在Newsletter的訂閱群發,如果把所有訂戶的Email地址都放在To或CC里,那么每個用戶都會知道其余所有人的Email地址,從而互相約炮、欺詐,因此Newsletter請采用BCC或單獨發送,并允許用戶退訂。
Moonglade的通知系統采用Email方式,但設計比較基礎。一個完善的通知系統需要采用消息隊列及事件設計,并采用三方服務。例如Azure上可以使用Storage Queue + Function App + SendGrid,以免遇到大批量Email發送的時候原地爆炸。
下篇將主要介紹
【博客協議或標準】
歡迎關注
汪宇杰博客
.NET | Azure |?微軟MVP
長按二維碼獲取我的最新技術分享
喜歡本篇內容請點個在看
總結
以上是生活随笔為你收集整理的博客系统知多少:揭秘那些不为人知的学问(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【新插件发布】AzureAD运维Exce
- 下一篇: 博客系统知多少:揭秘那些不为人知的学问(