blob: f15406c81fd5026ee2cc260174ebc2fa0f03b74b [file] [log] [blame]
.. _admin-plugins-esi:
.. include:: ../../common.defs
ESI Plugin
**********
.. Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
This plugin implements the ESI specification.
Specification
=============
Supported ESI tags:
::
esi:include
esi:remove
esi:comment
esi:vars
esi:choose
esi:when
esi:otherwise
esi:try
esi:attempt
esi:except
<!--esi ... -->
Extended ESI tags: ``esi:special-include``
Supported variables:
::
$(HTTP_HOST)
$(HTTP_REFERER)
$(HTTP_ACCEPT_LANGUAGE{name})
$(HTTP_COOKIE{name}) or $(HTTP_COOKIE{name;subkey})
$(QUERY_STRING{name})
$(HTTP_HEADER{hdr_name})
Note: the name is the key name such as "username", "id" etc. For cookie support sub-name or sub-key, the format is:
name;subkey, such as "l;u", "l;t" etc. e.g. such cookie string: l=u=test&t=1350952328, the value of
$(HTTP_COOKIE{"l;u"}) is test and the value of $(HTTP_COOKIE{"l;t"}) is 1350952328
Compilation and Installation
============================
This plugin is considered stable and is included with |TS| by default. There
are no special steps necessary for it to be built and installed.
Enabling ESI
============
1. First, enable the ESI plugin by adding an entry for it in :file:`plugin.config`. Here is an example of such an entry
without passing any optional arguments to ESI:
::
esi.so
2. There are four optional arguments that can be passed to the above ``esi.so`` entry:
- ``--private-response`` will add private cache control and expires headers to the processed ESI document.
- ``--packed-node-support`` will enable the support for using the packed node feature, which will improve the
performance of parsing cached ESI document. As mentioned below, this option is not extensively tested and is therefore
not recommended for production environments
- ``--disable-gzip-output`` will disable gzipped output for output which would **not** already be gzipeed anyway.
- ``--first-byte-flush`` will enable the first byte flush feature, which will flush content to users as soon as the entire
ESI document is received and parsed without all ESI includes fetched. The flushing will stop at the ESI include markup
till that include is fetched.
- ``--max-doc-size <number-of-bytes>`` (or ``--max-doc-size=<number-of-bytes>``) gives the maximum size of the document,
in bytes. The number of bytes must be an unsigned decimal integer, and can be followed (with no white space) by
a K, to indicate the given number is multiplied by 1024, or by M, to indicate the given number is multiplied by
1024 * 1024. Example values: 500, 5K, 2M. If this option is omitted, the maximum document size defaults to 1M.
3. ``HTTP_COOKIE`` variable support is turned off by default. It can be turned on with ``-f <handler_config>`` or
``-handler <handler_config>``. For example:
::
esi.so -f handler.conf
The ``handler.conf`` file then contains the list of allowed cookie names. For example, to allow the ``A`` and ``LOGIN``
cookies, the file will look like the following:
::
allowlistCookie A
allowlistCookie LOGIN
You can also allow all cookies for ``HTTP_COOKIE`` variable by using a wildcard character. For example:
::
allowlistCookie *
4. An entry in :file:`remap.config` will be needed to map to the orginer server providing the ESI response. Assume that
the ATS proxy is ``abc.com``, your origin server is ``xyz.com``, and the URI containing ESI markup is
``http://xyz.com/esi.php``. In this case, the following line in :file:`remap.config` will be needed:
::
map http://abc.com/esi.php http://xyz.com/esi.php
5. Your response should contain ESI markup and a response header of ``X-Esi: 1``. Here is a PHP example:
::
<?php header('X-Esi: 1'); ?>
<html>
<body>
Hello, <esi:include src="http://abc.com/date.php"/>
</body>
</html>
6. You will also need a mapping for the resource in the ESI include (``http://abc.com/date.php`` in this case) in
:file:`remap.config` if it is not already present:
::
map http://abc.com/date.php http://xyz.com/date.php
Or if both your ESI response and the ESI include comes from the same origin server, your :file:`remap.config` entry can
have the following single generic rule for all resources instead of separate rules for ``date.php`` and ``esi.php``:
::
map http://abc.com/ http://xyz.com/
7. Here is sample PHP content for ``date.php``:
::
<?php
header ("Cache-control: no-cache");
echo date('l jS \of F Y h:i:s A');
?>
Useful Notes
============
1. With proper cache control headers for each, the ESI response and the ESI include responses can be cached separately.
This is extremely useful for rendering a page with multiple modules. The page layout can be an ESI response with
multiple ESI includes, each for a different module. Thus |TS| can have a single cached entry for the page layout ESI response
while each individual ESI included responses can also be cached separately, each with a different duration per their
cache-control headers.
2. We do **not** recommend running the plugin with "packed node support" because it is not fully tested.
Differences from Spec - http://www.w3.org/TR/esi-lang
=====================================================
1. ``<esi:include>`` does not support "alt" and "onerror" attributes.
2. ``<esi:inline>`` is not supported.
3. You cannot have ``<esi:try>`` inside another ``<esi:try>``.
4. ``HTTP_USER_AGENT`` variable is not supported.
5. ``HTTP_COOKIE`` supports fetching for sub-key.
6. ``HTTP_HEADER`` supports accessing request headers as variables except "Cookie".