# Html探索系列 Meta标签

META 标签是 HTML 语言 HEAD 区的一个辅助性标签。**它提供关于 HTML 文档的元数据**。它不会显示在页面上，但是对于机器是可读的。可用于浏览器（如何显示内容或重新加载页面），搜索引擎（关键词），或其他 web 服务。

## 什么是元数据？

元数据（Metadata）被定义为：描述数据的数据，对数据及信息资源的描述性信息。

比如一本书的元数据：书名、作者、出版社、总页数、出版时间、书的描述（是关于什么的书）等。

HTML 文档的元数据：**字符集、页面描述、日期时间、页面刷新、关键字、文档作者和视口设置**等。

## meta有什么用？

META 标签用来描述一个 HTML 网页文档的元数据。它提供的信息用户是不可见，它主要是供机器解读的，告诉机器该如何解析这个页面。另外，还有一个用途是可以添加服务器发送到浏览器的 http 头部内容。

* 搜索引擎（SEO）优化

  meta 标签的一个很重要的功能就是设置关键字，来帮助网页被各大搜索引擎登录，提高网站的访问量。在这个功能中，最重要的就是对 **keywords** 和 **description** 的设置。因为按照搜索引擎的工作原理，搜索引擎首先派出机器人自动检索页面中的 keywords 和 decription，并将其加入到自己的数据库，然后再根据关键词的密度将网站排序。
* 定义页面使用语言
* 定义 http 头部内容
* 自动刷新页面
* 控制页面缓存
* 实现网页转换时的动画效果 （IE 浏览器）
* 网页定级评价

  在IE的 internet 选项中有一项内容设置，可以防止浏览一些受限制的网站，而网站的限制级别就是通过 meta 属性来设置的。

  级别的评定是由美国RSAC，即娱乐委员会的评级机构评定的。如果你需要评价自己的网站，可以连接到网站，按要求提交表格，那么 RSAC 会提供一段 meta 代码给你，复制到自己网页里就可以了。

  ```html
  <mata http-equiv="Pics-label" Contect="">
  ```
* 控制页面显示的窗口
* 等等…

META 标签定义的元数据的类型：

| content    | 定义与 http-equiv 或 name 属性相关的元信息。 |
| ---------- | ------------------------------- |
| name       | 描述文档级别的元数据，应用于整个页面              |
| http-equiv | 编译指令，提供的信息与类似命名的HTTP头部相同        |
| charset    | 一个字符集声明，告诉文档使用哪种字符编码            |
| scheme     | 定义用于翻译 content 属性值的格式。h5不支持     |

## content属性

meta 标签有 http-equiv 或 name 属性时，一定要有 content 属性对其进行说明。

## name属性

name 属性主要用于描述网页，对应于网页内容，以便于搜索引擎机器人查找、分类。

如果没有提供 name 属性，那么名称/值对中的名称会采用 http-equiv 属性的值。如：

```html
<meta content="text/html; charset=utf-8">

<!--等价于-->
<meta http-equiv="content-Type" content="text/html; charset=utf-8">
```

name 常见参数有：

| 属性               | 说明                         |
| ---------------- | -------------------------- |
| application-name | 定义正运行在该网页上的网络应用名称          |
| keywords         | 告诉搜索引擎网页的关键字是什么            |
| description      | 告诉搜索引擎网页的主要内容              |
| author           | 标注网页的作者                    |
| generator        | 标注网站是采用什么软件制作的             |
| copyright        | 标注版权                       |
| viewport         | 控制浏览器窗口的大小和缩放的，在移动端浏览器非常常用 |
| robots           | 告诉搜索机器人哪些页面需要索引，哪些页面不需要索引  |

```html
<!--定义正运行在该网页上的网络应用名称-->
<meta name="application-name" content="anmin">

<!--定义搜索引擎的关键字，搜索引擎在遇到这些关键字时，会用这些关键字对文档进行分类-->
<meta name="keywords" content="HTML, CSS, JavaScript">

<!--定义您的网页描述-->
<meta name="description" content="Free Web tutorials for HTML and CSS">

<!--定义页面的作者-->
<meta name="author" content="John Doe">
```

### viewport参数

一个常用的针对移动网页优化过的页面的 viewport meta 标签大致如下：

```html
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
```

* width：控制 viewport 的大小，可以指定的一个值，如果 600，或者特殊的值，如 device-width 为设备的宽度（单位为缩放为 100% 时的 CSS 的像素）。
* height：和 width 相对应，指定高度。
* initial-scale：初始缩放比例，也即是当页面第一次 load 的时候缩放比例。
* maximum-scale：允许用户缩放到的最大比例。
* minimum-scale：允许用户缩放到的最小比例。
* user-scalable：用户是否可以手动缩放

### robots参数

Robots 用来告诉搜索机器人哪些页面需要索引，哪些页面不需要索引。默认是 all。

```html
<meta name="robots" Content="All|None|Index|Noindex|Follow|Nofollow">
```

* all：文件将被检索，且页面上的链接可以被查询
* none：文件将不被检索，且页面上的链接不可以被查询；与 `noindex, no follow` 起相同作用
* index：文件将被检索（让机器人或爬虫登录）
* follow：页面上的链接可以被查询
* noindex：文件将不被检索，但页面上的链接可以被查询；(不让机器人或爬虫登录)
* nofollow：文件将不被检索，页面上的链接可以被查询。(不让机器人或爬虫顺着此页的连接往下探找)

### revisit-after参数

如果页面不是经常更新，为了减轻搜索引擎爬虫对服务器带来的压力，可以设置一个爬虫的重访时间。如果重访时间过短，爬虫将按它们定义的默认时间来访问。

```html
<meta name="revisit-after" content="7 days" >
```

### renderer参数

renderer 是为双核浏览器准备的，用于指定双核浏览器默认以何种方式渲染页面。比如说360浏览器。

```html
<!--默认webkit内核-->
<meta name="renderer" content="webkit">
<!--默认IE兼容模式-->
<meta name="renderer" content="ie-comp">
<!--默认IE标准模式-->
<meta name="renderer" content="ie-stand">
```

### referrer参数

控制所有从该文档发出的 HTTP 请求中 HTTP Referer 首部的内容，默认 no-referrer-when-downgrade。

如修改为 origin：

![image-20200829201150240](https://my-files-1259410276.cos.ap-chengdu.myqcloud.com/md_images/image-20200829201150240.png)

```html
<meta name="referrer" content="origin">
```

* no-referrer：不要发送 HTTP Referer 首部
* origin：发送当前文档的 origin
* no-referrer-when-downgrade：当目的地是先验安全的（https->https）则发送 origin 作为 referrer ，但是当目的地是较不安全的 （https -> http）时则不发送 referrer 。这个是默认的行为。
* origin-when-crossorigin：在同源请求下，发送完整的URL (不含查询参数) ，其他情况下则仅发送当前文档的 origin。
* unsafe-URL：在同源请求下，发送完整的URL (不含查询参数)。

**动态地插入**`<meta name="referrer">` (通过 `document.writ`e 或者 `appendChild`) 是不起作用的。同样注意如果同时有多个彼此冲突的策略被定义，那么 `no-referrer` 策略会生效。

### 其他参数

```html
<!--表示添加到主屏后的标题-->
<meta name="apple-mobile-web-app-title" content="标题">

<!--表示隐藏状态栏/设置状态栏颜色：只有在开启WebApp全屏模式时才生效。content的值为default | black | black-translucen-->
<meta name="apple-mobile-web-app-status-bar-style" content="black">

<!--表示启用 WebApp 全屏模式-->
<meta name="apple-mobile-web-app-capable" content="yes">

<!--表示忽略数字自动识别为电话号码、忽略识别邮箱、-->
<meta name="format-detection" content="telephone=no">
<meta name="format-detection" content="email=no">
<meta name="format-detection" content="telephone=no,email=no">

<!--禁止跳转至地图-->
<meta name="format-detection" content="adress=no">

<!--页面的最新版本-->
<meta name="revised" content="web app V.1.0.0" />
```

## http-equiv属性

http-equiv 顾名思义，相当于 http 的文件头作用。http-equiv 属性是添加 http 头部内容，对一些自定义的，或者需要额外添加的 http 头部内容，需要发送到浏览器中，我们就可以是使用这个属性。

http-equiv 属性主要有以下几种参数：

### content-type参数

content-type 用于设定网页字符集，便于浏览器解析与渲染页面。

```html
<!--HTML5以下-->
<meta http-equiv="content-Type" content="text/html;charset=utf-8">
<!--HTML5-->
<meta charset="utf-8">
```

### content-language参数

用以说明主页制作所使用的文字以及语言。

```html
<meta http-equiv="content-language" content="zh-CN">
```

还可以是：EN、FR等语言代码。

### refresh参数

设置一个周期（以秒为单位），之后，将从服务器重新加载当前页面，还可以指定要加载的其他URL。

```html
<!--表示当前页面每5秒钟刷一下-->
<meta http-equiv="refresh" content="5"/>
<!--表示当前页面5秒后跳到首页其他地址-->
<meta http-equiv="refresh" content="5; url=">
<!--表示页面直接跳转到其他网页-->
<meta http-equiv="refresh" content="0; url=">
```

### default-style参数

设置默认 CSS 样式表组的名称。content 属性的值必须与同一文档中的脚本或链接元素上的title属性匹配。

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

\*\*注意：\*\*上面 content 属性的值必须匹配同一文档中的一个 link 元素上的 title 属性的值，或者必须匹配同一文档中的一个 style 元素上的 title 属性的值。

### X-UA-Compatible参数

用于告知浏览器以何种版本来渲染页面。一般都设置为最新模式，在各大框架中这个设置也很常见。

```html
<!--指定IE和Chrome使用最新版本渲染当前页面-->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
```

### cache-control参数

指定浏览器如何缓存某个响应以及缓存多长时间。

```html
<meta http-equiv="cache-control" content="no-cache">
```

共有以下几种用法：

* no-cache：先发送请求，与服务器确认该资源是否被更改，如果未被更改，则使用缓存。
* no-store：直接禁止浏览器以及所有中间缓存存储任何版本的返回响应。
* public：即使有关联的 HTTP 身份验证，甚至响应状态代码通常无法缓存，也可以缓存响应，即**内容可以被客户端和代理服务器缓存**。 大多数情况下，它不是必需的，因为明确的缓存信息（例如 `max-age`）已表示响应是可以缓存的。
* private：通常只为单个用户缓存，因此不允许任何中间缓存对其进行缓存，**即客户端可以缓存，代理服务器不可缓存**。 例如，用户的浏览器可以缓存包含用户私人信息的 HTML 网页，但 CDN 却不能缓存。
* maxage：表示当前请求开始，该响应在多久内能被缓存和重用，而不去服务器重新请求。例如：max-age=60表示响应可以再缓存和重用 60 秒。
* must-revalidation/proxy-revalidation：如果缓存的内容失效，请求必须发送到服务器/代理以进行重新验证。

禁止百度自动转码：

```html
<meta http-equiv="Cache-Control" content="no-siteapp" />
```

### pragma参数

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

```html
<meta http-equiv="Pragma" content="no-cache" />
```

### expires参数

用于设定网页的到期时间，过期后网页必须到服务器上重新传输。

```html
<meta http-equiv="expires" content="Sunday 26 October 2016 01:00 GMT" />
```

### Set-Cookie参数

如果网页过期。那么这个网页存在本地的cookies也会被自动删除。

```html
<meta http-equiv="Set-Cookie" content="user=lizh; path=/; expires=Thu, 01 Jan 2022 00:00:02 GMT">
```

> `Blocked setting the` user=lizh; path=/; expires=Thu, 01 Jan 1970 00:00:02 GMT`cookie from a tag.`
>
> 为了减轻跨站点脚本（XSS）攻击的风险，此行为已从最新的HTML规范和Firefox 68中删除[.Google Chrome 65](https://www.chromestatus.com/feature/6170540112871424)已于2018年3月停止支持。

### Window-target参数

强制页面在当前窗口以独立页面显示，用来防止别人在框架里调用自己的页面。

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

### content-security-policy参数

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

CSP 的实质就是白名单制度，开发者明确告诉客户端，哪些外部资源可以加载和执行，等同于提供白名单。它的实现和执行全部由浏览器完成，开发者只需提供配置。 CSP 大大增强了网页的安全性。攻击者即使发现了漏洞，也没法注入脚本，除非还控制了一台列入了白名单的可信主机。

两种方法可以启用 CSP：

* 服务器端配置
* 通过 HTTP 头信息的 Content-Security-Policy 的字段

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

以下是常用的指令名说明，多个指令用分号隔开:

| 指令名         | 说明                                  |
| ----------- | ----------------------------------- |
| default-src | 默认策略，可以应用于js文件/图片/css/ajax请求等所有访问   |
| script-src  | 定义js文件的过滤策略                         |
| style-src   | 定义css文件的过滤策略                        |
| img-src     | 定义图片文件的过滤策略                         |
| connect-src | 定义请求连接文件的过滤策略                       |
| font-src    | 定义字体文件的过滤策略                         |
| object-src  | 定义页面插件的过滤策略。如object、embed、applet。   |
| media-src   | 定义媒体的过滤策略。audio、video               |
| frame-src   | 定义加载子frmae的策略                       |
| sandbox     | 沙盒模式，会阻止页面弹窗、js执行等。可以通过添加策略来放开相应的操作 |
| report-uri  | -                                   |

常用的指令值：所有以 -src 结尾的指令都可以用一下的值来定义过滤规则，多个规则之间可以用空格来隔开。

| 指令值                | 说明                                          |
| ------------------ | ------------------------------------------- |
| \*                 | 允许任意地址的url，但是不包括 blob: filesystem: schemes. |
| 'none'             | 所有地址的咨询都不允许加载                               |
| 'self'             | 同源策略,即允许同域名同端口下,同协议下的请求                     |
| data:              | 允许通过data来请求咨询 (比如用Base64 编码过的图片).           |
| domain.example.com | 允许特性的域名请求资源                                 |
| .example.com       | 允许从 example.com下的任意子域名加载资源                  |
| <https://cdn.com>  | 仅仅允许通过https协议来从指定域名下加载资源                    |
| https:             | 只允许通过https协议加载资源                            |
| 'unsafe-inline'    | 允许行内代码执行                                    |
| 'unsafe-eval'      | 允许不安全的动态代码执行，比如 JavaScript 的 eval()方法       |

### 网页过渡效果

在IE5.5及以上版本的浏览器中，页面被载入和退出时的一些过渡效果。

具体值有：

* Page-Enter : 进入页面
* Page-Exit : 离开页面
* Site-Enter : 进入网站
* Site-Exit : 离开网站

content 表示页面过渡的效果设置，这里的两个属性表示分别表示：

* Duration : 过渡速度
* Transition : 可选项。整数值(Integer)。具体数值可查看 [网页过渡效果](https://blog.csdn.net/cl61917380/article/details/39206715)。

```html
<meta http-equiv="Page-Enter" content="revealTrans(Duration=2.0,Transition=12)" /> 
```

注：ie 9 以上已经不支持。

### 其他参数

```html
<!--指定返回的数据编码，通常是压缩型-->
<meta http-equiv="content-encoding" content ="gzip">
<meta http-equiv="Content-Encoding" content="zip" />

<!--设置页面中脚本的类型-->
<meta http-equiv="Content-Script-Type" content="text/javascript" />

<!--表示dns预先加载-->
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="">

<!--设置页面创建的日期和时间-->
<meta http-equiv="Date" content="Mon, 31 Jan 2022 16:00:00 GMT" />

<!--设置页面上次修改的时间和日期设置-->
<meta http-equiv="Last-Modified" content="Mon, 31 Jan 2022 16:00:00 GMT" />
```

## charset属性

charset 属性是 HTML5 中的新功能，它声明 HTML 文档使用的字符集（字符编码）。如果使用了这个属性，其值必须是与 ASCII 大小写无关 的 `utf-8`。

charset 有两种写法，下面两种写法是等价的，不过更推荐使用第一种写法：

```html
<!--HTML5 写法-->
<meta charset="utf-8">
<!--html5 之前的写法-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
```

## 特定场景的使用

### 移动端

```html
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<meta name="format-detection"content="telephone=no, email=no" />

<!-- 删除苹果默认的工具栏和菜单栏 -->
<meta name="apple-mobile-web-app-capable" content="yes" />

<!-- 设置苹果工具栏颜色 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
```

### IE浏览器

```html
<!-- 是否开启cleartype显示效果 -->
<meta http-equiv="cleartype" content="on">
<meta name="skype_toolbar" content="skype_toolbar_parser_compatible">


<!-- IE 10 Windows 8 -->
<meta name="msapplication-TileImage" content="pinned-tile-144.png">
<meta name="msapplication-TileColor" content="#009900">

<!-- IE 11 Windows 9.1 -->
<meta name="msapplication-config" content="ieconfig.xml">
```

### chrome浏览器

```html
<!-- 禁止自动翻译 -->
<meta name="google" value="notranslate">
```

### UC浏览器

```html
<!-- UC应用模式 -->
<meta name="browsermode" content="application">

<!-- 将屏幕锁定在特定的方向 -->
<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">
```

### QQ手机浏览器

```html
<!-- 锁定屏幕在特定方向 -->
<meta name="x5-orientation" content="landscape/portrait">

<!-- 全屏显示 -->
<meta name="x5-fullscreen" content="true">

<!-- 页面将以应用模式显示 -->
<meta name="x5-page-mode" content="app">
```

### IOS

```html
<!-- IOS启用 WebApp 全屏模式 -->
<meta name="apple-mobile-web-app-capable" content="yes" />

<!-- IOS全屏模式下隐藏状态栏/设置状态栏颜色 content的值为default | black | black-translucent -->
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />

<!-- IOS添加到主屏后的标题 -->
<meta name="apple-mobile-web-app-title" content="标题">

<!-- IOS添加智能 App 广告条 Smart App Banner -->
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">


<!-- Smart App Banner -->
<meta name="apple-itunes-app" content="app-id=APP_ID,affiliate-data=AFFILIATE_ID,app-argument=SOME_TEXT">
```

## 参考资料

[HTML meta标签总结与属性使用介绍](https://segmentfault.com/a/1190000004279791)

[HTTP 缓存](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=zh-cn#cache-control)

[前端安全配置之Content-Security-Policy(csp)](https://www.cnblogs.com/heyuqing/p/6215761.html)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lizh.gitbook.io/knowledge/html-tan-suo-xi-lie/03html-tan-suo-xi-lie-meta-biao-qian.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
