1

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

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

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

4

4 回答 4

3

您可以在虚拟机中设置 Akamai 的ETS(ESI 测试服务器)并将其反向代理回您的 localhost 服务器。我以前用 Vagrant 做过类似的事情。

它似乎支持大多数 ESI 语言特性,包括变量、if/else 等。

于 2014-02-18T12:47:06.827 回答
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 <@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;
    }
}
于 2013-09-02T14:01:53.657 回答
0

布鲁斯-我在这里大声思考,但是您是否尝试过修改主机文件?我很确定 ESI 需要在 Akamai 边缘服务器上进行处理,但是如果您能够将其修改为 Akamai 的暂存服务器,那么您应该可以在本地对其进行测试吗?

再说一次,我只是在这里大声思考。

于 2013-08-29T14:22:18.980 回答
0

以防万一有人仍然需要它。您可以使用 FireFox 和我写的附加组件:
https
://addons.mozilla.org/en-US/developers/addons 这是来源:
https
://github.com/DKurilo/esi_testing_extension 所以如果有人想添加一些东西, esi:variable,例如,不客气!

于 2018-06-08T18:33:30.447 回答