我已经开始在 Akamai 中使用 ESI。当我有一个在实际通过 Akamai 运行的 int/test/stage/production 环境中运行的站点时,它们工作得非常好。
但是,当我们在 PC 上本地工作时,我们倾向于只使用一个简单的码头服务器,并且该站点不使用 Akamai 提供服务。这使得在不将我们的解决方案部署到 Akamai 的情况下查看工作是否正确有点具有挑战性。
有没有办法在不使用 Akamai 的情况下在本地模拟 ESI 以进行开发?
您可以在虚拟机中设置 Akamai 的ETS(ESI 测试服务器)并将其反向代理回您的 localhost 服务器。我以前用 Vagrant 做过类似的事情。
它似乎支持大多数 ESI 语言特性,包括变量、if/else 等。
我找不到任何官方的方法来做到这一点,所以我在服务器端模拟了一个 ESI,就好像它是一个 SSI,在我们的 freemarker 中使用了一个 IF 语句。
我使用 spring、freemarker + java 来做这个解决方案:
1)创建一个宏,如果在本地运行,将决定使用 ESI 或通过 SSI 模拟它(可能不需要 noescape,取决于您的设置方式)
<#macro esi url>
<#if esiUrl?contains("localhost")>
<#noescape>${ssiInclude(url)}</#noescape>
<#else>
<esi:include src="${esiUrl}/${url}" />
</#if>
</#macro>
2) 使用带有 url <@html.esi url="my/url" /> 的宏
3) 在 java/spring 中公开 SSI Include 方法(您需要为 esiUrl 和站点基本 url 设置一些特定于环境的值)
<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
......
<property name="attributesMap" ref="staticAttributesMap"/>
</bean>
<util:map id="staticAttributesMap">
<entry key="esiUrl" value="${esi.url}" />
<!-- formatters -->
<entry key="ssiInclude" >
<bean class="com.channel4.bips.web.freemarker.SsiIncludeMethodModel">
<property name="urlBase" value="${base.url}/"/>
</bean>
</entry>
</util:map>
4)在freemarker中模拟SSI的java
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;
import org.apache.commons.lang.Validate;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.List;
public class SsiIncludeMethodModel implements TemplateMethodModel {
private String urlBase;
@Override
public Object exec(List list) throws TemplateModelException {
String uri = (String) list.get(0);
Validate.notNull(uri);
return readContents(urlBase + uri.trim());
}
public String readContents(String address) {
StringBuilder contents = new StringBuilder(2048);
BufferedReader br = null;
try {
URL url = new URL(address);
br = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = br.readLine()) != null) {
contents.append(line);
}
} catch (IOException x) {
x.printStackTrace();
return "Error getting SSI data";
} finally {
close(br);
}
return contents.toString();
}
private static void close(Reader br) {
try {
if (br != null) {
br.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setUrlBase(String urlBase) {
this.urlBase = urlBase;
}
}
布鲁斯-我在这里大声思考,但是您是否尝试过修改主机文件?我很确定 ESI 需要在 Akamai 边缘服务器上进行处理,但是如果您能够将其修改为 Akamai 的暂存服务器,那么您应该可以在本地对其进行测试吗?
再说一次,我只是在这里大声思考。