我已经开始在Akamai中使用ESI了。当我在一个实际运行在Akamai上的int / test / stage / production环境中运行一个站点时,它们工作得很好。
但是,当我们在PC上本地工作时,我们倾向于使用简单的码头服务器,并且不使用Akamai提供站点。如果不将我们的解决方案部署到Akamai,这将使得工作是否正确具有一定的挑战性。
有没有办法在不使用Akamai的情况下在本地模拟ESI进行开发?
答案 0 :(得分:3)
您可以在虚拟机中设置Akamai的ETS(ESI测试服务器),然后将其反向代理回本地主机服务器。我之前和Vagrant做过类似的事情。
它似乎支持大多数ESI语言功能,包括变量,if / else等。
答案 1 :(得分:1)
我找不到任何正式的方法,所以我在服务器端模拟了一个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的宏 &lt; @html.esi url =“my / url”/&gt;
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)java在freemarker中模拟SSI
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;
}
}
答案 2 :(得分:0)
布鲁斯 - 我在这里大声思考,但你尝试过修改主机文件吗?我非常确定ESI需要在Akamai边缘服务器上进行处理,但如果您能够将其修改为Akamai的临时服务器,那么应该让您在本地进行测试吗?
同样,我只是在这里大声思考。
答案 3 :(得分:0)
以防有人仍然需要它。你可以使用FireFox和我写的插件:
https://addons.mozilla.org/en-US/developers/addons
这是来源:
https://github.com/DKurilo/esi_testing_extension
因此,如果有人想要添加某些内容,例如esi:variable,那么欢迎您加入!