请查阅 勘误表,了解自本规范发布以来报告的所有错误或问题。
本规范的英文版本为唯一具有规范效力的版本。也可能会有非规范性的 翻译 可供参考。
Copyright © 2017 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
Webmention 是一种简单的方式,当你在你的网站上提到某个 URL 时,可以通知该 URL。从接收方的角度来看,它是一种请求当其他网站提及它时收到通知的方式。
本节描述了本文件在发布时的状态。其他文件可能会取代本文件。当前 W3C 发布的规范列表和本技术报告的最新修订版可在 W3C 技术报告索引 https://www.w3.org/TR/ 查阅。
本文件由 社交网络工作组 作为推荐标准发布。如果你希望对本文件提出意见,请发送至 public-socialweb@w3.org(订阅, 存档)。欢迎所有意见。
请参阅工作组的 实现报告。
本文件已由 W3C 成员、软件开发者及其它 W3C 组织和相关方评审,并作为 W3C 推荐获得主任认可。该文件为稳定文档,可以作为参考资料或被其他文档引用。W3C 的角色是提升规范关注度,促进它的广泛部署,从而增强 Web 的功能与互操作性。
本文件由一支遵循 2004年2月5日 W3C 专利政策 运作的团队制作。W3C 维护了一份与小组成果相关的专利披露公开列表;该页面还包括披露专利的说明。任何人如果实际知晓某项专利且认为其包含 必要权利要求 ,则必须根据 《W3C 专利政策》第6节 披露相关信息。
W3C 预计本推荐规范中的功能不会受 Fetch 变动影响。
本文件依据 2015年9月1日 W3C 流程文件 管理。
Webmention 是一种用于通知另一个 URL 被某个 URL 链接所引用的机制。例如,Alice 在她的博客上写了一篇有趣的文章,Bob 随后在他自己的网站上写了一篇回应,并链接回 Alice 的原始帖子。Bob 的发布系统发送一个 Webmention 给 Alice,通知 Alice 她的文章得到了回应,Alice 的系统可将该回应显示为原始文章下的评论。
发送 Webmention 并不局限于博客文章,也可以用于其它类型的内容和回复。例如,回复可以是某个事件的 RSVP、对他人文章的“点赞”、对他人文章的“收藏”等等。Webmention 支持在不同网站之间进行此类互动,实现分布式的社交网络。
本节为非规范性内容。
Webmention 规范最初是 [Pingback] 规范的简化版本。Pingback 需要用 XML-RPC 方式发送源 URL 和目标 URL,而 Webmention 将之简化为表单编码,这样可以更容易地在 HTML 表单中使用,也便于利用现有工具处理表单编码数据,同时避免了 XML-RPC 可能带来的系统代码泄露问题。
Webmention 随后进一步规范了发送和验证请求的细节,并扩展支持当源文档被更新或删除时发送通知。更多信息可参阅 IndieWeb wiki 上的 Webmention 常见问题。
本节为非规范性内容。
典型的 Webmention 流程如下:
本节为非规范性内容。
Webmention 消息从源 URL 发送到目标 URL,以通知目标其被源 URL 提及。
source 设置为 Barnaby 文章的永久链接target 设置为 Aaron 文章的永久链接target 是否为其博客的有效永久链接(否则终止)。source,跟随重定向 [FETCH],校验该页面是否实际包含对 target
的超链接,不存在则终止。本文件中的 "必须"、"禁止"、"要求"、"应当"、"不应"、"推荐"、"不推荐"、"建议"、"可以" 以及 "可选",需按照 [RFC2119] 的定义进行解释。
Webmention 实现可分为发送端或接收端。本节描述这两类的符合性标准。
以下是已知的 Webmention 实现类型。
Webmention 发送端指能够发送 Webmention 信息的实现。发送端要发送 Webmention,首先必须有一个可以被接收端访问的源 URL。
Webmention 发送端的符合性标准在发送 Webmention部分描述。
如下为部分常见的 Webmention 发送端类型:
Webmention 接收端指能够为一个或多个目标 URL 接收 Webmention,并用相关的 Webmention 端点进行公告的实现。为能收到 Webmention,需有一个已声明 Webmention 端点的 URL,但该 URL 不一定属于接收端实现本身,也可能来自另一个系统或域名。
Webmention 接收端的符合性标准在接收 Webmention部分描述。
如下为部分常见的 Webmention 接收端类型:
请在 http://webmention.net/implementation-reports/ 提交你的实现报告,具体说明见页面内容。实现报告模板参考 webmention.rocks 提供的测试。
webmention.rocks 提供了许多可用于现场测试实现的测试用例,也是开发 Webmention 实现时非常实用的工具,因为该站点会在遇到错误时详细反馈响应内容。
本规范中的 HTML 和 HTTP 链接关系均采用 [HTML5] 定义的 link rel 注册表。
Webmention 消息从源 URL 发送到目标 URL,通知目标其被源 URL 所提及。在 Webmention 发送前,必须存在一个“源” URL,通常是博客文章,也可以是其它类型的内容。
例如,https://waterpigs.example/post-by-barnaby 的页面 HTML 可包含如下链接到 Aaron 帖子的内容:
<!doctype html>
<html>
<body>
<a href="https://aaronpk.example/post-by-aaron">This is a great post</a>
</body>
</html>
发送方必须获取目标 URL(并跟随所有重定向 [FETCH]),并检查 HTTP Link 头 [RFC5988] 是否包含 rel="webmention"。如果文档内容类型为 HTML,则发送方必须查找 rel="webmention" 的 HTML <link> 和
<a> 元素。如三种方式均出现,则优先顺序为第一个 HTTP Link,其次是文档顺序中的第一个 <link> 或
<a>。发送方必须支持所有三种方式并按上述顺序回退。
端点可以是相对 URL,此时发送方必须用 [URL] 规范把该端点补全为相对于目标 URL 的绝对路径。
端点可以含查询参数,这些参数必须保留为查询参数,禁止发送到 POST 请求体内。
发送方可以先发 HTTP HEAD 请求 [RFC7231] 检查 Link 头,再发 GET 请求。
GET /post-by-aaron HTTP/1.1
Host: aaronpk.example
HTTP/1.1 200 OK
Link: <http://aaronpk.example/webmention-endpoint>; rel="webmention"
<html>
<head>
...
<link href="http://aaronpk.example/webmention-endpoint" rel="webmention" />
...
</head>
<body>
....
<a href="http://aaronpk.example/webmention-endpoint" rel="webmention">webmention</a>
...
</body>
</html>
发送方可以自定义 HTTP User Agent [RFC7231],在获取目标 URL 时指明此次请求为 Webmention 发现的一部分,推荐在 User Agent 字符串中包含 "Webmention" ,方便对方了解请求来源。
发送方必须向 Webmention 端点发送
x-www-form-urlencoded [HTML5] 表单数据,包含
source 和
target 两个参数。其中 source 为包含链接的发送方页面 URL,target 为被链接的目标页面 URL。
如 Webmention 端点 URL 自身含有查询参数,则这些参数必须保留,并禁止随 POST 请求体发送。
Webmention 端点将校验并处理请求,并返回 HTTP 状态码 [RFC7231]。通常返回 202 Accepted 或
201 Created,表示请求已入队,异步处理,防止 DoS 攻击。如果响应码为 201,Location 头会指明可用于查询请求状态的 URL。
任何 2xx 响应码必须视为请求成功。
POST /webmention-endpoint HTTP/1.1
Host: aaronpk.example
Content-Type: application/x-www-form-urlencoded
source=https://waterpigs.example/post-by-barnaby&
target=https://aaronpk.example/post-by-aaron
HTTP/1.1 202 Accepted
若源 URL 已被修改,发送方推荐重新发送所有已发 Webmention(包括对已移除的链接也重新发送),并对新增链接也推荐发送 Webmention。
这样,Webmention 接收方可更新对源文档的显示,或通知收件人其被提及内容已变动。
当文章更新时重发 Webmention,发送方必须为每个目标 URL 重新发现 Webmention 端点,以防对方已更新端点。
如果源页面上显示了对目标的回复(如作为评论显示),则发送方也应视为源页面变动并推荐重新发送所有已发 Webmention。
若源 URL 被删除,发送方推荐为该 URL 返回 HTTP 410 Gone 状态码,并推荐以“墓碑”方式显示(即所有属性内容清空、或主内容如名称/正文字段改为“Deleted”)。随后,发送方推荐重新发送所有曾为该文档发出的 Webmention。
如此 Webmention 接收端支持删除,则可自动移除已显示过的 Webmention;不支持删除的仍能通过内容变动适当回退。
接收到带 source 和 target 参数的 POST 请求时,接收方推荐校验参数(见下文请求校验),然后推荐将请求异步队列处理,以防止 DoS 攻击。根据处理方式,请求响应有三种可能结果:
接收方若为请求分配了状态页,可供发送方查询,则必须返回 HTTP 201 Created 状态,并在
Location 头中附上该状态 URL。响应体可以带内容。
HTTP/1.1 201 Created
Location: http://aaronpk.example/webmention/DEhB9Jme
如果接收方异步处理请求但未返回状态 URL,则必须返回
HTTP 202 Accepted,响应体可以含文本,推荐为人类可读内容。
HTTP/1.1 202 Accepted
若接收方选择同步处理并同步校验(不推荐),则请求成功时必须返回
200 OK 状态。
接收方必须检查
source、target 是否为有效 URL [URL],并且协议方案为接收方支持的类型(通常为 http 或 https)。
若 source 和 target 相同,接收方必须拒绝请求。
接收方推荐校验 target
是否为自身可接收 Webmention 的有效资源。此校验推荐同步执行,以便在深入验证前快速拒绝无效请求。“有效资源”含义由实现决定,比如某些可接收多域 Webmention,某些仅限本域。
注意 target URL 可带片段标识符,若接收方限制可接收的 URL,应在校验时忽略片段部分。
Webmention 验证推荐异步处理,以防止 DoS 攻击。
如果接收方准备对 Webmention 进一步处理(如将其显示为评论、增加“点赞”计数、通知作者等),其必须对 source 执行 HTTP GET(跟随重定向,建议限制重定向次数),确认页面是否实际包含对 target 的引用。接收方推荐带 Accept 头声明可接受内容类型。
接收方推荐按媒体类型规则判断 source 是否提及
target。例如在 [HTML5] 文档中查找
<a href="*">、<img href="*">、<video src="*">
等链接。JSON ([RFC7159]) 文档则查找属性值全等于 target
的项。纯文本情况下查找字符串匹配。其它类型由实现自定。只有 source 文档内容和 target URL 完全一致时,才视为有效 Webmention。
至此,接收方可以将 source 页内容连同其它采集到的数据发布到目标页或其它页面,例如将 source 内容作为评论显示,或在“点赞者”列表显示作者头像等。
二次发布 source 页内容时应注意不要无意间扩大其可见性。例如,若源文档仅向部分用户可见,在转载时应确保不向公众开放。源文档可通过认证或仅允许局域网访问来受限,如果接收方也在同一网络或有权限也需遵守此规则。
若 Webmention 请求因发送方自身原因失败,必须返回
400 Bad Request 状态,可可以在响应体内提供错误描述。
同步校验 source 前可返回这些发送方相关错误:
target URL 未找到。target URL 不接受 Webmention。source URL 语法非法或协议不支持(如 mailto:)。获取 source 内容后可能出现的错误:
source URL 未找到。source URL 未包含对 target 的链接。如因接收方服务器问题 Webmention 失败,推荐返回
500 Internal Server Error,并可以在响应体内附错误描述。
如果接收方之前收到过相同 source 和 target 的
Webmention,
410 Gone,或为
200 OK 但未找到 target,则推荐删除已有 Webmention
或标记为删除。
source 和 target 的
Webmention、内容不变时只算一次回复。Webmention 协议依赖发送端发起 GET(或 HEAD)请求来发现接收端的 Endpoint,然后接收端又会对发送端的网页发起 GET 请求用于校验链接。这意味着发送端可以导致接收端对任意 URL 发起 GET 请求,存在潜在 DoS 风险。
接收端可以在校验链接时首先发 HTTP HEAD 请求,初步检查内容类型、长度或相关 Header,再决定是否进行完整 GET 请求。
接收端推荐限制HTTP重定向次数,例如最多跟踪20次,以防因发送端连续重定向导致陷入循环。
接收端推荐限制抓取未经验证 source URL 时的数据量和时长。例如 source URL 超过5秒无响应可视为失败,同样可只抓取页面的前1MB内容,一般合理的 HTML 或 JSON 页面不会超过此大小。
在发送方发现接收方 Webmention endpoint 时,几乎没有理由将 endpoint 设置为 localhost 或其它 loopback 地址。如果发送方有监听本地服务且未设鉴权,恶意 Webmention 接收端可能构造一个 endpoint 导致发送方对自身本地接口发起任意 POST 请求。
在发现步骤中,如果 endpoint 是 localhost 或回环IP(127.0.0.0/8),发送方不应向其发送 Webmention。
本规范未对包含额外 Header 或参数(如认证 Header、会话 Cookie)的 Webmention 请求做特殊处理。但如 Webmention endpoint 接受含额外 Header 的请求,应推荐防范 CSRF 攻击。其中一种方式是在 endpoint 的查询参数里加入 CSRF token,使得 Webmention 发送方在发现 endpoint 时一并得到该 token。
例如,目标 URL 可声明一个带 CSRF token 的 Webmention endpoint:
GET /post-by-aaron HTTP/1.1
Host: aaronpk.example
HTTP/1.1 200 OK
Link: <http://aaronpk.example/webmention?csrf=Q0NTVhYjI0NTVkNDA3M>; rel="webmention"
Webmention endpoint 处理请求时,可先校验 CSRF token 再继续处理其它逻辑。
攻击者可以声明一个指向任意 URL 的 Webmention endpoint。所以如果你在防火墙内服务器或有权限访问内部资源的环境中安装 Webmention 发送端软件,需要注意,攻击者可能导致服务器对内网服务器发POST请求。推荐采取措施防止访问受保护资源,可以:
下列问题基于自我评估问卷:安全与隐私([security-privacy-questionnaire]),简要总结本规范涉及的安全与隐私注意事项。
如果你的源文档不是 HTML(如 PDF),或因受限无法直接用 HTTP GET 请求获取原文(如需付费墙或点击协议),你需建立一个 HTML “落地页”,其中列出所有目标链接。创建好 HTML 落地页后即可用其 URL 作为 Webmention 的 source。这能让接收端有个可抓取 URL 校验对目标的链接,同时避免将完整源文档公开。
制作 HTML 落地页还能提升你的内容被外部引用的频率,为受限内容(如论文)提供一个适合引用的页面。论文类内容建议 HTML 页直接展示参考文献列表,以便用作 Webmention 的 target URL。
如果你的源文档规模非常大(如包含上千条记录的大表HTML页,或超大JSON文件),不建议直接用其作为 source 发送 Webmention。这样可能导致接收端下载整个数据集,消耗大量带宽,或者接收端只下载一部分内容而引发校验失败。如果接收端对外转发你的 source 链接,其他访客也可能意外下载完整大数据集。
如网页分页显示数据集是最佳实践,发送 Webmention 时,大数据应仅从较小数据页发起;HTML 可直接用分页后的页面作 source,JSON 则推荐为每页单独设一个较小的 json 文档并用其做 source。
执行 Webmention 发现 时,发送端推荐遵守目标 URL 返回的 HTTP 缓存头 [RFC7234],避免高于Header指定频率地抓取同一目标 URL。
IANA 已根据 [RFC5988] 第6.2.1节,登记了如下链接关系类型:
如你实现中希望将 source 和
target 参数视为 URI,可在参数前添加 http://www.w3.org/ns/webmention# 前缀。
本节为非规范性内容。
下列 Webmention 扩展规范已在互联网上有2个及以上互操作实现,特此列出:
[Vouch] 协议是 Webmention 的一个反垃圾邮件扩展。
[Salmention] 协议是 Webmention 的一个扩展,用于上游分发评论与其它交互行为。
[Private-Webmention] 协议是支持受权限控制的文章发送和验证 Webmention 的扩展。
本节为非规范性内容。
本节为非规范性内容。
你可以在 IndieWeb wiki 上查阅 Webmention 相关文章。
本节为非规范性内容。
你可以在 webmention.net 查阅 Webmention 实现列表
编辑特别感谢 Sandeep Shetty 对 Webmention 规范原始草案的贡献。
此外,编辑还要感谢 IndieWeb 社区和其他实现者的支持、鼓励和热情,包括但不限于:Amy Guy、Benjamin Roberts、Ben Werdmüller、Dave Wilkinson、Rob Sanderson 和 Tantek Çelik。
本节为非规范性内容。
注:URL 可在不同上下文中以多种方式使用。为生成严格的 URL,建议参考 [RFC3986] 和 [RFC3987]。URL 规范定义了 URL 一词、相关算法以及用于构造、解析和解析(resolve)URL 的 API。开发者建议关注 https://url.spec.whatwg.org/ 追踪最新进展。
需要注意的是,Web 浏览器与 HTML 外的软件栈在处理 URL 时方式不尽相同。虽然不会采纳破坏现有 Web 内容的
URL 处理变更,但部分 URL 行为因此为实现自定义(如 file: 解析或不符 RFC3986/3987 的语法操作)。
1.1 社交网络工作组
本节为非规范性内容。
Webmention 是社交网络工作组开发的多个相关规范之一。对替代方案或补充协议感兴趣的实现者应首先阅读概览文档 [social-web-protocols]。