浅谈之 - HTML 的 meta 标签有多少种

前言

meta 标签是 html 标记 head 区的一个关键标签,它位于HTML文档的 <head><title> 之间(有些也不是在<head><title>之间)。它提供的信息虽然用户不可见,但却是文档的最基本的元信息。meta 标签用来描述一个 HTML 网页文档的属性,例如作者、日期和时间、网页描述、关键词、页面刷新等。

meta 标签结构

从官方文档来看 : The Document-level Metadata element, 这个标签有四个属性:

  • charset
  • content
  • http-equiv
  • name

charset

charset 属性规定 HTML 文档的字符编码。 它是 HTML5 中的新属性,且替换了

1
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

虽然仍然允许使用 http-equiv 属性来规定字符集,但是使用新方法可以减少代码量。

常用的值有:

  • UTF-8 - Unicode 字符编码
  • ISO-8859-1 - 拉丁字母表的字符编码

在理论上,可以使用任何字符编码,但并不是所有浏览器都能够理解它们。某种字符编码使用的范围越广,浏览器就越有可能理解它。 如需查看所有可用的字符编码,请访问 IANA 字符集

content

content 属性的内容是 htp-equiv 或 name 属性的值,具体取决于你用哪一个。(无法单独使用)

http-equiv

该属性可以包含HTTP头的名称,属性的英文全称为 http-equivalent 。它定义了可以改变 server 和 user-agent 行为的指令。该指令的值在 content 属性内定义。

name

name 属性的定义是属于 document-level metadata,不能和以下属性同时设置: http-equiv 或 charset。 该元数据名称与 content 属性包含的值相关联。

接下来我们详细介绍一下 http-equiv 和 name 属性的值。都有很多值,不同的值表示不同的意思。

http-equiv 的属性值

因为整个浏览器的历史跨度很大,有很多旧的 http-equiv 的值到了现代浏览器,其实已经废弃了, 我们先讲一下剩余的还有效的 http-equiv 的值。 具体文档可以看: mozilla http-equiv, 我们先来介绍文档中明确标有的属性:

1. content-security-policy

允许页面作者定义当前页面的内容策略。内容策略主要指定允许的服务器地址和脚本端点,这有助于防止 XSS(cross-site scripting) 攻击。

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

两种方法可以启用 CSP。一种是通过 HTTP 头信息的Content-Security-Policy的字段。 即:

1
Content-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https:

网络用图

另一种是通过网页的 <meta> 标签。

1
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

上面代码中,CSP 做了如下配置:

  • 脚本:只信任当前域名
  • 标签:不信任任何URL,即不加载任何资源
  • 样式表:只信任cdn.example.org和third-party.org
  • 框架(frame):必须使用HTTPS协议加载
  • 其他资源:没有限制

启用后,不符合 CSP 的外部资源就会被阻止加载, 浏览器的控制台就会报错。

网络用图

具体更多关于 CSP 安全策略的,可以看 Content Security Policy 入门教程

2.content-type

这个其实已经过时了,因为如果要设置字符编码的话,推荐使用元素上的charset属性。

并且由于无法在 XHTML 或 HTML5 的 XHTML 序列化中更改文档类型 (文档类型只能是这个 text/html), 因此不要使用将MIME类型设置为XHTML MIME类型。

所以这个属性其实没有用处了

3.default-style

指定要使用的首选样式表, 例如:

1
<meta http-equiv="default-style" content="the document's preferred stylesheet">

上面 content 属性的值必须匹配同一文档中的一个 link 元素上的 title 属性的值,或者必须匹配同一文档中的一个 style 元素上的 title 属性的值。 这个属性其实很少用到。

4.x-ua-compatible

用于告知浏览器以何种版本来渲染页面。X-UA-Compatible 是针对 IE8 版本的一个特殊文件头标记,用于为 IE8 指定不同的页面渲染模式。 不过现在基本上 IE 系列的浏览器基本上都凉了,所以现在基本上都是这样子配的:

1
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >

这个意思就是如果 IE 有安装 Google Chrome Frame,那么就走安装的组件,如果没有就使用最高版本的 IE。

ps1: 针对IE 6,7,8等版本的浏览器插件 Google Chrome Frame,可以让用户的浏览器外观依然是IE的菜单和界面,但用户在浏览网页时,实际上使用的是Google Chrome浏览器内核。

ps2: 而且这东西主要是用于设置 IE 兼容性,现在只支持 “IE=edge” 这一个值,并且只有低于 2013 年发行的 IE 11 版本才需要设置它。

5.refresh

该指令指定:

  1. 如果content属性只包含一个正整数,则表示该页面重新加载的秒数。

    1
    <meta http-equiv="refresh" content="300">
  2. 如果content属性包含一个正整数,后跟字符串 ; url =,那么表示当前页面XX秒后重定向到另一个有效的URL。

    1
    <meta http-equiv='refresh' content='2;URL=http://www.github.com/'> //意思是2秒后跳转到github

以上这 5 个属性,就是 W3C 目前针对 meta 的 http-equiv 属性定义的规范值,但是除了这些属性之外,还有一些早期浏览器有兼容的属性,不过现在都已经过时了, 基本上现代浏览器都不再支持了,也稍微了解一下。

6. 已过时 http-equiv 的值

1.Pragma (已过时)

禁止浏览器从本地计算机的缓存中访问页面内容。如:

1
<meta http-equiv='Pragma' content='no-cache'>

2.Expires (已过时)

可以用于设定网页的到期时间。一旦网页过期,必须到服务器上重新传输。

1
<meta http-equiv="Expires" content="0" />

3.Cache-Control (已过时)

指定请求和响应遵循的缓存机制。 一般常用的几个设置值:

  • max-age(单位为s)指定设置缓存最大的有效时间,定义的是时间长短
  • public 指定响应会被缓存,并且在多用户间共享
  • private 响应只作为私有的缓存,不能在用户间共享
  • no-cache 指定不缓存响应,表明资源不进行缓存
  • no-store 绝对禁止缓存

关于 cache-control 的字段设置值,可以看 浅谈之-浏览器缓存

1
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />

这三个属性在 HTML5 的时候就被设置为过期了,这是因为 W3C 推荐页面的缓存策略应该是要通过 HTTP 的 response header 来设置的,是属于服务端策略。 因此不建议在前端的页面中设置。

而且这个是 IE 时代的私有属性,在 IE9 以前支持的,而现在主流的 Chrome / Firefox / Safari,包括 IE9 ~ IE11 都不支持。 这个东西是 HTTP/1.0 时代的产物,因为 HTTP/1.0 里关于缓存的可设定太少了,而 HTTP/1.1 刚出来的时候还不是所有浏览器都支持,所以把这个玩意儿放到了 HTML 页面里了。如果你的页面需要兼容 IE 低版本,那么可以加上。

现在上哪找还只支持 HTTP/1.0 的 Web 服务器去啊,全都是 HTTP/1.1 了。而且随着 HTTPS 的普及,估计很快就该全面 HTTP/2 了。 所以现代浏览器几乎已经不再支持这种方式,如果是 IE9 更早的浏览器的页面要设置为不缓存的话,那么倒是可以这样子设置:

1
2
3
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

定义页面的cookie,这个也是已经过时的属性了,现代浏览器也不会支持了,现在都是使用 HTTP 头的 Set-Cookie 替代

5.Window-target (已过时)

强制页面在当前窗口以独立页面显示:

1
<meta http-equiv="Window-target"content="_top">

这个也是过时了,现代浏览器根本不支持了。具体看 Does Window-target meta tag work for busting frames?

name 的属性值

接下来我们介绍一下 name 的属性值,还是一样,先从 W3C 的官方文档先看: Standard metadata names, 根据 W3C 的规范来看, name 属性其实分为三大类:

  • HTML 规范
  • 其他的规范
  • 其他值

这三块都在文档里面,某种程度上也都是标准, 现代浏览器都要支持。 但是除了这三块, 各种互联网大厂以及不同的浏览器厂家也都有自己的特殊的值。

1. HTML 规范的值

这一部分的内容主要是为了 SEO 相关的,尤其是 description 和 keywords,对 SEO 来说尤为重要。

1.1 application-name

定义在网页中运行的应用程序的名称。 其实主要用于比较复杂的网页,比如 SPA 之类的

1.2 author

用于标注网页作者

1.3 description

包括一个关于页面内容的缩略而精准的描述。一些浏览器,如Firefox和Opera,会使用这个当做网页书签的默认描述。

1.4 generator

用于标明网页是什么软件做的。

1.5 keywords

用于告诉搜索引擎,你网页的关键字

1.6 referrer

referrer 控制 document 发起的 Request 请求中附加的 Referer HTTP header,相应的值在content中:

value description
空字符串 默认值 no-referrer-when-downgrade
no-referrer 不发送 HTTP Referer 头
origin 发送 document 的 origin
no-referrer-when-downgrade 这个是默认值,当请求安全级别下降时不发送 referrer。目前,只有一种情况会发生安全级别下降,即从 HTTPS 到 HTTP。HTTPS 到 HTTP 的资源引用和链接跳转都不会发送 referrer。
same-origin 对于同源的链接和引用,会发送referrer,其他的不会。
origin-when-cross-origin 这个相当于 origin 和 same-origin 的 OR 合体。同源的链接和引用,会发送完全的 referrer 信息;但非同源链接和引用时,只发送源信息。
strict-origin 这个相当于 origin 和 no-referrer-when-downgrade 的 AND 合体。即在安全级别下降时不发送 referrer, 安全级别未下降时发送源信息。(注意:这个是新加的标准,有些浏览器可能还不支持。)
strict-origin-when-cross-origin 同源的链接和引用,会发送 referrer。安全级别下降时不发送 referrer。其它情况下发送源信息。(注意:这个是新加的标准,有些浏览器可能还不支持。)
unsafe-URL 无论是否发生协议降级,无论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松而最不安全的策略。

其实这个属性还跟 web 安全有关系,甚至很多跟盗链相关的策略也跟它有关系, 这也是为啥它的 value 有那么多细致的安全方面的区别了,关于 referrer 跟安全的关系, 具体可以看 web 安全之 - 页面禁用 referer(第三方站点的 referer 头部泄露重置密码链接)

1.7 theme-color

可以设置浏览器的地址栏或者是手机端的选项卡的颜色:

1
<meta name="theme-color" content="#91D4DA">

如果在 IOS 下,那么就会变成选项卡的颜色。

1.8 revisit-after (已过时)

如果页面不是经常更新,为了减轻搜索引擎爬虫对服务器带来的压力,可以设置一个爬虫的重访时间。如果重访时间过短,爬虫将按它们定义的默认时间来访问。 这个属性已经过时了,不建议用了(这个已经不在官方文档上了),具体看 Meta Tag Revisit-After expire

1
<meta name='revisit-after' content='7 days' >

2. 其他规范的值

2.1 color-scheme

比如 css 色彩规范就有这个值,用于指定文档的配色方案, 最经常见就是网页的暗黑模式:

1
<meta name="color-scheme" content="light dark">

不过这个是需要浏览器支持的,是属于还在完善中的标准。

2.2 viewport

css 设备适配规范就有这个值,这个也是做手机端页面必须要用到的一个 meta 值,关于 viewport 的理解,可以看这一篇文章 移动前端开发之viewport的深入理解, 其中有关于 3 个 viewport 的理论:

  • layout viewport -> 浏览器默认的viewport, 这个layout viewport 的宽度可以通过 document.documentElement.clientWidth来获取。
  • visual viewport -> 浏览器可视区域的大小, visual viewport的宽度可以通过 window.innerWidth 来获取
  • ideal viewport -> 移动设备的理想viewport
value description
width 设置 layout viewport 宽度,也可以用 device-width
height 设置 layout viewport 的高度,也可以用 device-height
initial-scale 设置页面的初始缩放值,为一个数字,可以带小数, 范围在 0.0 - 10.0
maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数, 范围在 0.0 - 10.0
minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数, 范围在 0.0 - 10.0
user-scalable 是否允许用户进行缩放,值为”no”或”yes”, no 代表不允许,yes代表允许
viewport-fit 控制文档是如何填充满屏幕的, 有三个值, auto 表示 此值不影响初始布局视图端口,并且整个web页面都是可查看的。 contain 表示视图端口按比例缩放,以适合显示内嵌的最大矩形。 cover 表示视图端口被缩放以填充设备显示。这个属性目前大部分的浏览器还没有兼容,具体看 viewport-fit

最常见的情况就是设置为:

1
<meta name="viewport" content="width=device-width, initial-scale=1">

这样子的意思就是 要把当前的 viewport 宽度设为 ideal viewport 的宽度。

3. 其他官方属性值

接下来介绍其他的官方属性值。

3.1 creator

文档的创建者,可以是组织或者是机构,如果有多个,就写多个 meta 标签

3.2 publisher

文档的发布者

3.3 robots

搜索引擎的机器人策略,robots 用来告诉爬虫哪些页面需要索引,哪些页面不需要索引,具有以下值:

value description Used By
index 允许robot索引本页面(默认) All
noindex 不允许robot索引本页面 All
follow 允许搜索引擎继续通过此网页的链接索引搜索其它的网页(默认) All
nofollow 搜索引擎不继续通过此网页的链接索引搜索其它的网页 All
all 等同于 index + follow Google
none 等同于 noindex + nofollow Google
noarchive 要求搜索引擎不缓存页面内容 Google, Yahoo, Bing
nosnippet 禁止在搜索引擎结果中显示该页面的任何描述。 Google, Bing
noimageindex 要求此页面不作为引用页面的索引图像的显示。 Google
nocache noarchive 同义 Bing

如果规则比较复杂的话,直接在站点根目录使用 robots.txt 来描述规则会更好。

3.4 googlebot

robots 一样,google 的爬虫会参照这个

4.一些非官方的属性

上面的 1,2,3 都是 W3C 官方文档中的属性, 但是还有一些是互联网大厂或者是其他浏览器兼容的,但是这些属性就不能保证这些现代的浏览器都兼容了。

4.1 google 规范的值

具体文档可以看这个 Google 可以识别的特殊标记, 除了上面列到的官方属性之外,这些的 name 大部分都是 google, 还有以下:

  1. nositelinkssearchbox
    当用户搜索您的网站时,Google 搜索结果有时会显示一个供您网站专用的搜索框,以及其他直接指向您网站的链接。此标记用于告知 Google 不要显示站点链接搜索框。

    1
    <meta name="google" content="nositelinkssearchbox" />
  2. notranslate
    如果 Google 发现网页内容所用的语言很可能不是用户想阅读的语言,则往往会在搜索结果中提供翻译链接。这样通常会让您有机会将独特而富有吸引力的内容提供给更多用户。不过,在某些情况中,您可能并不希望我们这样做。此元标记用于告知 Google 您不希望我们提供该网页的翻译。

    1
    <meta name="google" content="notranslate" />
  3. nopagereadaloud
    禁止网络浏览器使用 Google 助理语音指令“阅读此页”和“阅读”来朗读已标记的网页。

    1
    <meta name="google" content="nopagereadaloud" />
  4. google-site-verification
    您可以在网站的顶级网页上使用此标记,以向 Search Console 验证您对该网站的所有权。请注意,虽然“name”和“content”属性的值必须与提供给您的值完全匹配(包括大小写),但是否将标记从 XHTML 更改为 HTML,或者标记的格式是否与网页的格式相符,这些都无关紧要。

    1
    <meta name="google-site-verification" content="..." />
  5. rating
    将网页标记为包含成人内容,以表明网页应被安全搜索结果滤除。

    1
    <meta name="rating" content="adult" />

4.2 apple 规范的值

具体文档可以看: Supported Meta Tags, 具有以下值, 都是只有 IOS 下才有用:

  1. apple-mobile-web-app-capable
    是否启用 WebApp 全屏模式, content 值为 yes 时会隐藏工具栏和菜单栏

    1
    <meta name="apple-mobile-web-app-capable" content="yes">
  2. apple-mobile-web-app-status-bar-style
    是在 webapp 模式下,改变顶部状态条的颜色。默认值为default(白色),可以定为black(黑色)和 black-translucent(灰色半透明), 只有在 “apple-mobile-web-app-capable” content=”yes” 时生效

    1
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
  3. format-detection
    禁止自动探测并格式化手机号码, 如果是 telephone=no 就是忽略电话号码识别,如果是 email=no, 忽略邮箱格式识别。

    1
    <meta name="format-detection" content="telephone=no">
  4. apple-touch-fullscreen (已过时)
    这个是早期的属性,现在官方文档已经没有了, 推荐用这个属性 apple-mobile-web-app-capable

    1
    <meta name="apple-touch-fullscreen" content="yes">
  5. apple-itunes-app
    这个标签是告诉 iphone 的 safari 浏览器,这个网站对应的 app 是什么,然后在页面上面显示一个下载 banner 。

    1
    <meta name="apple-itunes-app" content="app-id=432274380" />

4.3 其他浏览器和大厂规范规范

  1. 百度相关

    1
    2
    3
    4
    5
    6
    <!-- 禁止百度转码 -->
    <meta http-equiv=“Cache-Control” content=“no-siteapp” />
    <meta http-equiv=“Cache-Control” content=“no-transform” />

    <!-- 禁止百度快照缓存 -->
    <meta name=“Baiduspider” content=“noarchive”>
  2. UC 手机浏览器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!-- 将屏幕锁定在特定的方向 -->
    <meta name="screen-orientation" content="landscape/portrait">
    <!-- 全屏显示页面 -->
    <meta name="full-screen" content="yes">
    <!-- 强制图片显示,即使是"text mode" -->
    <meta name="imagemode" content="force">
    <!-- 应用模式,默认将全屏,禁止长按菜单,禁止手势,标准排版,强制图片显示。 -->
    <meta name="browsermode" content="application">
    <!-- 禁止夜间模式显示 -->
    <meta name="nightmode" content="disable">
    <!-- 使用适屏模式显示 -->
    <meta name="layoutmode" content="fitscreen">
    <!-- 当页面有太多文字时禁止缩放 -->
    <meta name="wap-font-scale" content="no">
  3. QQ手机浏览器

    1
    2
    3
    4
    5
    6
    <!-- 锁定屏幕在特定方向 -->
    <meta name="x5-orientation" content="landscape/portrait">
    <!-- 全屏显示 -->
    <meta name="x5-fullscreen" content="true">
    <!-- 页面将以应用模式显示 -->
    <meta name="x5-page-mode" content="app">
  4. 360 浏览器

    1
    2
    <!-- 选择使用的浏览器解析内核 -->
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
  5. App Links
    这个可以在进行 SNS 分享的时候,可以定位到 app 上,以便将用户引导到下载上,具体可以看 内容元数据参考

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- iOS -->
    <meta property="al:ios:url" content="applinks://docs" />
    <meta property="al:ios:app_store_id" content="12345" />
    <meta property="al:ios:app_name" content="App Links" />
    <!-- Android -->
    <meta property="al:android:url" content="applinks://docs">
    <meta property="al:android:app_name" content="App Links">
    <meta property="al:android:package" content="org.applinks">
    <!-- Web Fallback -->
    <meta property="al:web:url" content="http://applinks.org/documentation" />
    <!-- More info: http://applinks.org/documentation/ -->

ps: 这个其实不是 name 属性的,而是 property 属性,不过这边就统一放非标准的。

  1. facebook sns 分享
    比如点击 facebook like 按钮, 设置包含下面要讲的 og 标签的应用,也都是为了 SNS 的分享, 具体看: 网站管理员分享指南
    1
    2
    <meta property="fb:admins" content="USER_ID"/>
    <meta property="fb:app_id" content="APPID"/>

ps: 这个其实不是 name 属性的,而是 property 属性,不过这边就统一放非标准的。

og 标签

og 标签虽然也不是官方标准的 meta 标签用法,但是它确实是 SNS 分享的标准取值,所以这边额外拉出来提一下

og 是一种新的HTTP头部标记,(即Open Graph Protocol:开放内容协议), 先看一下背景:

og 背景

2010年F8会议上Facebook公布了Open Graph,把这种种不同的Graph连结起来,将形成Open Graph。

Open Graph通讯协定(Protocol)本身是一种制定一套 Metatags 的规格,用来标注你的页面,告诉我们你的网页代表哪一类型的现实世界物件。另一伙伴网站,即Amazon旗下的Internet Movie Database(IMDb),将用这个Open Graph Protocol为每一部电影标注页面。按下IMDb上的“赞”按钮,就会自动把那部电影加入Facebook使用者profile中的“最爱的电影”。

Facebook已和Yahoo、Twitter合作采用OAuth 2.0认证标准。Graph API翻新了Facebook的平台程序代码,让Facebook里的每个物件都拥有独特的ID。通过Open Graph把其他社交网站建构的网络给连接起来,将创造一个更聪明、更与社交连接、更个人化也更具语意意识的网络。

Open Graph最让人津津乐道的是“喜欢”(Like)按钮,此按钮安装在伙伴网站,可立即用来表示认同。“活动”(Activity streams)外挂 ,让Facebook使用者友人所从事的各种活动都列在那个第三方网站上。“推荐”(Recommendations)外挂则向使用者提供备受建议的内容,“不只是十大最多人用电子邮件转寄的文章,这是真正超强的推荐”。“社交”(Social bar)可提供整合为一的社交体验,把“喜欢”按钮、Facebook聊天 、和友人名单资讯都整合起来,功能与Google Friend Connect或Meebo chat工具条相似。

Facebook新版本Graph API意味着Facebook上任何一个页面都会有独立的ID,用户可以成为某一页面的粉丝。该项功能将会使Facebook的每一页面连接成为一个整体。

og 属性

og 具有以下属性:

  • og:title -> 标题
  • og:type -> 类型, 常用值:article book movie
  • og:image -> 略缩图地址
  • og:url -> 页面地址
  • og:description -> 页面的简单描述
  • og:site_name -> 页面所在网站名
  • og:videosrc -> 视频或者Flash地址
  • og:audiosrc -> 音频地址

og 语法

og 标签虽然是 meta 标签,但是他不用 name, 而是用另一个非 W3C 规范的一个属性 property 来实现语法:

1
<meta property=”og:title” content=”{dede:field.title/} ” />

比如某一个站点是这样子设置的:

1
2
3
4
<meta property="og:url" content="https://web.xxx.com"/>
<meta property="og:type" content="article"/>
<meta property="og:description" content="xxxxxxxxx"/>
<meta property="og:image" content="https://xxx.xxx.com/xxx.png"/>

og 标签的好处

og 标签最大的好处就是对 SEO 的优化,都知道搜索引擎机器人爬取的是我们的页面,即html代码,meta 信息尤为关注,所以我们增加的 og meta 标签是可以别搜索引擎发现并评估权重的,也就是说你将原有 meta 信息优化手段同时使用到 og:title 这种属性值当中,加强 meta 信息优化内容;对于权重提升和排名还是很有利的。

而且目前大部分的 SNS 的分享都是通过读取页面的 og 标签来获取分享的内容的,比如分享的标题,分享的关键字,分享的图片,都是预先在 html 页面用 og 标签设置好的。

og 标签的兼容性

有些 seo 检测工具会检测到 Meta Property=og 报错,这个不管他。


参考资料