# Edge Side Includes

Edge Side Includes, oder ESI genannt, ist eine Auszeichnungssprache um Webseiten-Komponenten dynamisch zusammenzubauen und diese als fertige Seite auszuliefern. ESI ist ein Ansatz, um Skalierungsprobleme, die ein Webserver durch steigenden Verkehr bekommt, zu verhindern bzw. zu entschärfen.
Moderne Internetseiten bestehen häufig aus vielen Bausteinen mit unterschiedlicher Lebensdauer. Dies stellt Caching-Systeme vor völlig neue Aufgaben. Das Element einer Seite mit der kürzesten Lebensdauer bestimmt, wie lange sie im Cache gespeichert werden kann. Wird nun auf einer Seite mit vorwiegend statischen Inhalten ein dynamisches Element wie eine Mitteilungs-Box eingebunden, ist es nicht mehr sinnvoll, die Seite als Ganzes zu cachen, da die Mitteilungen zum Zeitpunkt der Zwischenspeicherung für die Lebensdauer des gecachten Elements statisch sind. Auf Caching zu verzichten würde jedoch bedeuten, dass sämtliche Inhalte der Seite mit jedem Aufruf neu zusammengebaut werden müssen, was sich auf die Rechenkosten und Auslieferungszeit der Seite auswirkt.
Zur Lösung dieses Problems hat eine Gruppe von Unternehmen (unter anderem Akamai, BEA Systems, Oracle Corporation) gemeinsam die ESI-Spezifikationen entwickelt und Version 1.0 der Spezifikation dem W3C im August 2001 zur Genehmigung vorgelegt, sie befindet sich derzeit im Status einer W3C NOTE.
ESI wird von einigen Content Delivery Networks (z. B. Akamai) und Proxy-Servern (z. B. Varnish, Squid und Mongrel) unterstützt. Während die meisten Proxy-Server häufig nur einen Teil der Spezifikation implementieren, hat Akamai weitere Features zu der von ihnen unterstützen Version hinzugefügt.

## Wie wird ESI implementiert?

ESI Element Tags werden in HTML oder anderen textbasierten Inhalten während der Erstellung eingefügt. Die durch diesen Tag definierten Elemente werden jedoch nicht direkt dargestellt, sondern vom ESI-Prozessor als Befehle für bestimmte Aktionen interpretiert. Die XML basierten ESI Tags zeigen dem ESI-Agenten an, welche Aktionen durchgeführt werden müssen, damit die Seite vollständig geladen werden kann. Ein einfaches Beispiel eines ESI-Elements ist ein include tag, der externe Inhalte in die Seite einbindet. Ein ESI include-Tag könnte wie folgt aussehen:
In diesem Beispiel würde der ESI-Prozessor versuchen die Quell-URL (src) aufzurufen, falls diese nicht erreichbar ist, wird die alternative URL (alt) verwendet. Wenn dies ebenfalls fehlschlägt wird das Element stillschweigend entfernt.
In Verbindung mit einem Proxycache-Server bietet ESI somit verschiedene Caching-Szenarien. Denkbar ist zum Beispiel, dass die aufgerufenen Dateien lokal zwischengespeichert werden und somit die Auslieferung dieser Inhalte beschleunigt wird. Alternativ kann auch die Seite, die die ESI-Tags einbettet, gecacht werden und lediglich die Inhalte, die über ESI geladen werden, werden bei jedem Aufruf neu angefragt. Dies erlaubt unterschiedliche Caching-Zeiten für ein und dieselbe Webseite oder unterschiedliche Grade der Personalisierung.

## Features

Die ESI-Spezifikation beschreibt unter anderem vier Hauptfeatures:
* Inklusion
* Variablen
* Bedingungen
* Fehlerbehandlung
Neben dem oben beschriebenen Einfügen von Seitenfragmenten per include können Variablen in ESI-Statements verwendet werden, die aus bestimmten HTTP-Headern (Accept-Language, Host, Referer, User-Agent), einem übermittelten Cookie oder einem Query-String (URL-Parameter) stammen. Diese Variablen sind schreibgeschützt und können in logischen Ausdrücken verwendet werden, um Inhalte abhängig von bestimmten Bedingungen zu laden. Die Fehlerbehandlung error handling erfolgt durch das onerror-Attribut, welches es erlaubt, darauf zu reagieren, dass die Original-Quelle nicht erreichbar ist, und statt eines HTTP-Statuscodes wie 404 eine alternative URL verwendet, um das Element zu laden, oder es aus der Ausgabe entfernt (siehe obiges Beispiel).

## Alternativen

Die Hauptalternative zu ESI besteht darin, das Zusammenfügen der Seiten bereits auf dem Webserver durch z. B. Server Side Includes und viele Arten von Server Side Scripting vorzunehmen, oder durch das Verwenden des Client Side Scripting des Browsers und Techniken wie Ajax.