本文基本上是ESI 1.0规范的简略版翻译,原文参见 ESI 1.0规范
翻译这个规范是因为工作需要了解ESI,而且规范较短也十分简单,翻译下也是顺便。
ESI是一个基于xml的语言,用于在客户端提供一个组装资源的方法。和其他内部标记语言不通,ESI一般用在像缓存服务器那种地方,用于提高性能,减轻源服务器的压力,增强可用性。ESI允许在CDN、浏览器或者反向代理等地方组装内容。
一般的,ESI用于缓存或反向代理处。
Version 1.0 includes the following functionality: ESI v1.0包含以下功能:
ESI组装模式是一个包含一些片段的模板。因为片段实际上是独立的资源,所以每个片段可以有不同的缓冲策略。比如模板可以缓存很多天,而一些经常变更的片段可以缓存短一点,或者干脆不缓存。
ESI元素是xml,在 ESI-specific XML名字空间。
include 定义一个用于组装的片段,它包含两个特殊行为。include格式如下:
<esi:include src="URI" alt="URI" onerror="continue" />
举例:
<esi:include src="http://example.com/1.html" alt="http://bak.example.com/2.html" onerror="continue"/>
<esi:include src="http://example.com/ search?query=$(QUERY_STRING{query})"/>
src如果是相对路径,则被认为是相对于模板的。当src访问失败时,会访问alt。如果没有指定onerror,那么返回一个大于400的错误码。当指定 onerror=”continue”,ESI处理器会删掉这个include。
基于客户端请求(http头、url参数等),ESI 1.0 支持以下变量:
| Variable Name | HTTP Header | Substructure Type | Example |
|---|---|---|---|
| HTTP_ACCEPT_LANGUAGE | Accept-Language | list | da, en-gb, en |
| HTTP_COOKIE | Cookie | dictionary | id=571; visits=42 |
| HTTP_HOST | Host | - | esi.xyz.com |
| HTTP_REFERER | Referer | - | http://roberts.xyz.com/ |
| HTTP_USER_AGENT | User-Agent | dictionary (special) | Mozilla; MSIE 5.5 |
| QUERY_STRING | - | dictionary | first=Robin&last=Roberts |
变量名总是大写的,引用一个变量,就用括号括起来,然后加($),例如:
$(HTTP_HOST)
一般情况,ESI变量是以字符串形式展示的,但有时候会自动解析成复杂的结构。访问这些变量用如下方法:
$(HTTP_COOKIE{username})
字典变量访问是大小写铭感的。这里还是举例,如果Cookie头里有visits=42,那么
$(HTTP_COOKIE{visits})
表示42.
User-Agent 头相关的字典只包含三个特殊值 browser, version and os。
os可能是”WIN”, “MAC”, “UNIX” or “OTHER”,browser可能是”MOZILLA”, “MSIE”, or “OTHER”,而version表示浏览器的版本。
列表的子结构访问返回的是布尔值,比如:
$(HTTP_ACCEPT_LANGUAGE{en-gb})
如果en-gb在HTTP_ACCEPT_LANGUAGE里,返回true,否则返回假。
空的,不存在或者无定义的变量会被解析为空字符串。ESI提供一种默认值表示方法:
$(VARIABLE|default)
举个例子:
<esi:include src="http://example.com/$(HTTP_COOKIE{id}|default).html"/>
如果id不存在,url会被解析为
http://example.com/default.html
当默认值有空格时,需要用单引号括起来,例如:
$(HTTP_COOKIE{first_name}|'new user')
当处理一个ESI模板时,每个include都会独立的执行(协议里没说这些http请求是并行还是串行)。这些子请求可能会用到原始请求里的http头,但是这些子请求中的http头会被忽略,它们不应该影响原始页面(组装的那个页面)。