Я не мог найти официального способа сделать это, поэтому я эмулировал ESI на стороне сервера, как если бы это был SSI, используя оператор IF в нашем freemarker.
Я использую весна, 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 = "мой/URL" />
3) разоблачили SSI Включить метод в Java/весной (вам нужно настроить какую-либо среду IC значение для 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 для эмуляции SSI в FreeMarker
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;
}
}
привет там, я не уверен, что изменение файла хост будет работать. На данный момент это отображается в браузере. Браузер не делает запрос на бэкэнд, поскольку он не знает, что означает этот тег. Спасибо, в любом случае –