在localhost上工作时模拟ESI

时间:2013-08-29 14:05:06

标签: akamai esi

我已经开始在Akamai中使用ESI了。当我在一个实际运行在Akamai上的int / test / stage / production环境中运行一个站点时,它们工作得很好。

但是,当我们在PC上本地工作时,我们倾向于使用简单的码头服务器,并且不使用Akamai提供站点。如果不将我们的解决方案部署到Akamai,这将使得工作是否正确具有一定的挑战性。

有没有办法在不使用Akamai的情况下在本地模拟ESI进行开发?

4 个答案:

答案 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,那么欢迎您加入!