本文基本上是ESI 1.0规范的简略版翻译,原文参见 ESI 1.0规范

翻译这个规范是因为工作需要了解ESI,而且规范较短也十分简单,翻译下也是顺便。

ESI简介

ESI是一个基于xml的语言,用于在客户端提供一个组装资源的方法。和其他内部标记语言不通,ESI一般用在像缓存服务器那种地方,用于提高性能,减轻源服务器的压力,增强可用性。ESI允许在CDN、浏览器或者反向代理等地方组装内容。

一般的,ESI用于缓存或反向代理处。

ESI功能概览

Version 1.0 includes the following functionality: ESI v1.0包含以下功能:

  • 包含:简单的说就是一个页面可以多个include,每个include是一部分内容,但是对于用户而言就好像只是一个http请求。
  • 变量支持:ESI v1.0支持一些基于http请求属性的变量,类似于CGI。
  • 条件处理:ESI允许布尔逻辑来控制怎么处理模板。
  • 异常和错误处理:ESI提供了一些标准来处理某些情况。

ESI组装模式是一个包含一些片段的模板。因为片段实际上是独立的资源,所以每个片段可以有不同的缓冲策略。比如模板可以缓存很多天,而一些经常变更的片段可以缓存短一点,或者干脆不缓存。

ESI元素

ESI元素是xml,在 ESI-specific XML名字空间。

include

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。

inline

choose | when | otherwise

try | attempt | except

comment

remove

vars

<!–esi …–>

ESI变量

基于客户端请求(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)

Variable Substructure Access

一般情况,ESI变量是以字符串形式展示的,但有时候会自动解析成复杂的结构。访问这些变量用如下方法:

$(HTTP_COOKIE{username})

Dictionary

字典变量访问是大小写铭感的。这里还是举例,如果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表示浏览器的版本。

List

列表的子结构访问返回的是布尔值,比如:

$(HTTP_ACCEPT_LANGUAGE{en-gb})

如果en-gb在HTTP_ACCEPT_LANGUAGE里,返回true,否则返回假。

Variable Default Values

空的,不存在或者无定义的变量会被解析为空字符串。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表达式

Operators

协议考虑点

当处理一个ESI模板时,每个include都会独立的执行(协议里没说这些http请求是并行还是串行)。这些子请求可能会用到原始请求里的http头,但是这些子请求中的http头会被忽略,它们不应该影响原始页面(组装的那个页面)。



blog comments powered by Disqus

Published

28 April 2015

Tags