博客系统知多少:揭秘那些不为人知的学问(三)

点击上方关注“汪宇杰博客”

上篇《博客系统知多少:揭秘那些不为人知的学问(二)》介绍了博客的基本功能设计要点,本篇介绍博客的协议或标准。

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. 结束语

5.1丨RSS

RSS(Really Simple Syndication)是一种基于XML的标准,普遍应用于包括博客在内的内容类网站,由Dave Winer于1999年发明,少年计算机天才Aaron Swartz参与定义规范,可惜后者于2013年1月自杀,年仅26岁。

RSS也是博客系统中最有标志性特性之一,其在博客中的应用广泛度成为了事实上的标准,没有RSS的博客系统就像看到不带摄像头的手机一样有趣。

RSS文件的扩展名可通常是 .rss 或 .xml,也可以不定义拓展名(如Moonglade的RSS)。内容为近期发表的博客文章的XML描述,包括标题、时间、作者、分类、摘要(也可以是全文)等信息。

(图:Moonglade的RSS源)

RSS是写给机器看的,可用于网站之间同步内容,例如当年人人网(前校内网)可通过RSS导入博客文章为日记。而对于普通用户,则需要RSS阅读器应用来订阅博客。通常这样的阅读器里不止订阅一个作者的博客,而是该用户关心的所有博客。阅读器通常也是跨平台、跨设备的,用户可以在电脑、平板、手机,甚至树莓派上订阅RSS源。

(图:2012年我在初代iPad上通过RSS订阅自己博客)

(图:最新版Microsoft 365 Outlook 中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对于博客来说,就是告诉阅读器,这个博客一共有哪些订阅源以及他们各自的订阅地址,通常就是每个文章分类是一个订阅源,全部文章又是一个订阅源。

(图:Moonglade的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所在的网站一个成功与否的响应。

(图:Moonglade的pingback终端)

接受Pingback请求:

自己的文章URL A被他人文章B引用,并收到了一个pingback XML。首先自己要验证别人的pingback请求长得是否奇怪,以保证安全性,例如有没有正常的methodName、有没有合法的双方URL、URL是否能正常访问、是否有奇怪的URL(例如localhost或有潜在攻击行为的特殊构造)。保证pingback请求没问题后,请求B的页面,抓取B网页的title内容、B的IP地址,记录到自己的数据库中,并和A文章关联。

收到的Pingback通常以系统身份自动在文章下加评论,但这个设计不是规范之一,你可以自由发挥,例如Moonglade把pingback集中起来在后台给博客管理员查看。

(图:Moonglade后台管理中查看哪些网站引用了自己博客的文章)

参考: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的博客系统。

(图:Microsoft Word的博客支持)

类似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 阅读器视图

大部分浏览器和客户端都有阅读器视图,可以让读者在与博客网站页面风格完全不一样的视图中阅读文章。例如,我博客某篇文章的正常页面长这样:

(图:Moonglade非阅读器视图文章页)

浏览器识别到我的博客支持阅读器视图,就会亮起沉浸式阅读按钮

(图:Microsoft Edge 浏览器沉浸式阅读按钮)

进入沉浸式阅读界面后,浏览器会自动提取文章的内容,识别文章的标题、章节、图片,去掉导航栏、侧边栏等与文章无关的元素,并可让用户控制文本大小、背景色,甚至朗读文章内容。

(图:Moonglade 的文章进入沉浸式阅读界面)

不仅我的博客有阅读器视图,设计良好的博客、新闻内容站都有,例如Azure的:

(图:Azure 官方博客阅读器视图)

另外,支持阅读器视图的网站,SEO一定不会差。因此设计博客系统时,请考虑支持阅读器视图。

下篇将主要介绍

【设计博客系统有哪些知识点】

欢迎关注

汪宇杰博客

.NET | Azure | 微软MVP

长按二维码获取我的最新技术分享

喜欢本篇内容请点个在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sql Server之旅——第十三站 深入的探讨锁机制

上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态&#xff0c;但是在现实世界上并没有这么简单的事情&#xff0c;起码我的表不会没有索引对吧&#xff0c;还有就是我的表一定会有很多的连接过来&#xff0c;10:1的读写&#xff0c;很多码农可能都会遇到类似神乎其神的…

后端程序员转行前端,强烈推荐这6个前端UI框架,第二款小程序UI框架颜值最高!...

昨天有个同事问我有没有可以直接上手的前端UI框架。那今天就给大家推荐6个简单、视觉体验好的前端框架没吃过猪肉&#xff0c;肯定见过猪跑&#xff01;Jquery Mobiledemo地址&#xff1a;https://demos.jquerymobile.com/1.1.0/教程地址:https://www.codesocang.com/jquerymob…

Kubernetes引发“军备赛”,K8s真是企业生存的关键吗

导语与许多其他国家一样&#xff0c;英国对云基础架构的需求空前增长。随着学校&#xff0c;办公室&#xff0c;商店和饭店的关闭以应对疫情&#xff0c;云驱动的应用程序应运而生&#xff0c;解决挑战并提供安慰。随着各个年龄段人群的屏幕时间激增&#xff0c;数据中心正努力…

【新插件发布】AzureAD运维Excel版插件,增删改查快10倍c以上!

在笔者的BI项目开发中&#xff0c;用到了Azure的AzureSQL和AzureAS分析服务&#xff0c;此两大服务&#xff0c;可和AzureAD帐号体系打通。而AzureAD帐号&#xff0c;在其免费功能基础功能上&#xff0c;是免费使用的&#xff0c;随着项目开发上线进入运维阶段&#xff0c;Azur…

数论相关

目录符号整除/同余理论常见符号数论函数常见符号其他常见符号位运算与、或、异或取反左移和右移复合赋值位运算符关于优先级位运算的应用有关 2 的幂的应用取绝对值取两个数的最大/最小值操作一个数的二进制位模拟集合操作快速幂模意义下大整数乘法快速乘高精度快速幂欧拉降幂求…

博客系统知多少:揭秘那些不为人知的学问(二)

点击上方关注“汪宇杰博客”上篇《博客系统知多少&#xff1a;揭秘那些不为人知的学问&#xff08;一&#xff09;》介绍了博客的历史、我的博客故事及博客的受众来源。本篇精彩继续&#xff0c;介绍博客基本功能设计要点。1.“博客”的前世今生2.我的博客故事3.谁是博客的受众…

二分+01分数规划+最大化平均值 Dropping tests POJ - 2976

题意&#xff1a; 给你若n个分数&#xff0c;分子a[i]a[i]a[i],分母b[i]b[i]b[i],使满足公式100⋅∑i1nai∑i1nbi100\cdot\tfrac{\sum_{i1}^{n} a_{i}}{\sum_{i1}^{n} b_{i}}100⋅∑i1n​bi​∑i1n​ai​​&#xff0c;求任意去掉k个分数后&#xff0c;公式结果最大值。 题目…

基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

莫比乌斯反演/容斥 +2020ICPC 江西省大学生程序设计竞赛 A Simple Math Problem

题目描述 输入描述: 输出描述: 示例1 输入 3 输出 5 分析&#xff1a; 1.这个题其实考的是一个莫比乌斯反演题&#xff0c;但是由于我知识储备不够&#xff0c;没有看出来&#xff0c;题目给的范围可以瞎搞一下&#xff0c;所以下面容斥可以过。 2.转换一下就是一道经典的…

猎鹰与龙飞船基于Linux,采用C++、Chromium与JS开发

最近两天科技界最重大的事件莫过于马斯克的 SpaceX 成功实现了猎鹰 9 号&#xff08;Falcon 9&#xff09;带着龙飞船&#xff08;Crew Dragon&#xff09;成功发射&#xff0c;并使飞船与国际空间站对接&#xff0c;将 NASA 两名宇航员送上了轨道前哨。背后关于 Falcon 9 与 C…

博客系统知多少:揭秘那些不为人知的学问(四)

点击上方关注“汪宇杰博客” ^_^上篇《博客系统知多少&#xff1a;揭秘那些不为人知的学问&#xff08;三&#xff09;》介绍了博客协议或标准。本篇终章介绍设计博客系统有哪些知识点。1.“博客”的前世今生2.我的博客故事3.谁是博客的受众&#xff1f;4. 博客基本功能设计要点…

Azure 国际版与中国版服务列表对(2020年6月版)

点击上方关注“汪宇杰博客” ^_^对于选择Azure平台的用户来说&#xff0c;会面临选择国内还是国际版的问题。由于一些原因&#xff0c;由世纪互联运营的中国大陆版Azure无法落地所有的国际版服务。相比几年前&#xff0c;情况已经有了一定的改善。本文列出了国际版和国内版Azur…

解读三组容易混淆的Dockerfile指令

长话短说&#xff0c;今天分享三组容易混淆的Dockerfile指令&#xff0c; 帮助大家编写更优雅的Dockfile文件、构建更纯净的Docker镜像。COPY vs ADDCOPY、ADD主体功能类似&#xff1a;从指定位置src拷贝文件到Docker镜像dest。COPY <src>... <dest> ADD <src&…

ASP.NET Core使用Nacos SDK访问阿里云ACM

背景 前段时间&#xff0c;cranelee 在Github上给老黄提了个issues&#xff0c; 问到了如何用Nacos的SDK访问阿里云ACM。https://github.com/catcherwong/nacos-sdk-csharp/issues/13刚看到这个issues的时候&#xff0c;老黄也是觉得一脸懵逼&#xff0c;好像这两者没有什么必然…

为.netcore助力--WebApiClient正式发布core版本

1、前言NCC WebApiClient 已成熟稳定&#xff0c;发布了WebApiClient.JIT 和 WebApiClient.AOT 两个 NuGet 包&#xff0c;累计近 10w 次下载。我对它的高可扩展性设计相当满意和自豪&#xff0c;但 WebApiClient 并不因此而停下脚步&#xff0c;在一年前&#xff0c;我产生了编…

一个static和面试官扯了一个小时,舌战加强版

一&#xff1a;背景1. 讲故事最近也是奇怪&#xff0c;在社区里看到好几篇文章聊static 的玩法以及怎么拿这个和面试官扯半个小时&#xff0c;有点意思&#xff0c;点进去看都是java版的&#xff0c;这就没意思了&#xff0c;怎么也得有一篇和面试官扯C# 中的 static用法撒&…

数据结构整理中。。。

目录栈队列链表单向链表双向链表向链表中插入&#xff08;写入&#xff09;数据单向链表单向循环链表双向循环链表从链表中删除数据单向&#xff08;循环&#xff09;链表双向循环链表哈希表哈希函数冲突拉链法闭散列法并查集启发式合并&#xff08;按秩合并&#xff09;带权并…

.NET开发者省份分布排名

什么叫.NET开发者省份分布排名呢&#xff1f; 顾名思义&#xff0c;这几个词大家都认识&#xff0c;.NET开发者都集中在城市&#xff0c;涵盖一线城市到五线城市。排名的方法非常简单粗暴&#xff0c;就是根据本公众号&#xff08;dotnet跨平台&#xff09;的省份订阅读者数量排…

创建型模式——单例模式

一、 实验目的与要求 1.练习使用单例模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 在山区或者边远地区火车站往往只有一个窗口在买票&#xff0c;但…

Sql Server之旅——终点站 nolock引发的三级事件的一些思考

曾今有件事情让我记忆犹新&#xff0c;那年刚来携程不久&#xff0c;马上就被安排写一个接口&#xff0c;供企鹅公司调用他们员工的差旅信息&#xff0c;然后我就三下五除二的给写好了&#xff0c;上线之后&#xff0c;大概过了一个月。。。DBA那边报告数据库出现大量锁超时&am…