Search code examples
varnishvarnish-vclesi

Varnish not processing ESI includes


I'm trying to setup Varnish to process ESI includes on a local environment.

I am running varnish in a virtual machine and the content is running on the host machine.

I have two files "index.html" and "test.html". These are both stored in a folder called "esi" in the docroot of an apache server.

index.html

<h1>It Works!</h1>
<esi:include src="test.html" /> 

test.html

<p>ESI HAS BEEN INCLUDED</p>

Varnish is running on the virtual machine on port 8000. So I access it here: http://192.168.56.101:8000/esi/

in /etc/varnish/default.vcl on the virtual machine I have added the followin config to the bottom of the file:

sub vcl_fetch {
   set beresp.do_esi = true; /* Do ESI processing               */
   set beresp.ttl = 24 h;    /* Sets the TTL on the HTML above  */
}

With the idea that it should process ESI on ALL requests (Dont care if its bad practice just trying to get this thing to work :))

The result when I load http://192.168.56.101:8000/esi/ is:

<h1>It Works!</h1>
<esi:include src="test.html" />

ie. the ESI is shown in the markup, it is not being processed.

I have checked the Varnish log, however there are no errors in there and nothing related to ESIs.

Can anyone see what I am doing wrong here? Let me know if more information is needed.. thanks


Solution

  • If your esi include src is "test.html" then varnish will be sending that request to your default backend, which is 127.0.0.1. I believe you need to configure a second backend for your remote server. Something like this:

    backend default {
        .host = "127.0.0.1";
        .port = "8000";
    }
    
    backend hostmachine {
        .host = "50.18.104.129"; # Enter your IP address here
        .port = "80";
    }
    

    Then in your sub vcl_recv you need to redirect traffic that has /esi/ in the URL to the remote server.

    sub vcl_recv {
          if (req.url ~ "^/esi/") {
                set req.backend = hostmachine;
                set req.http.host = "www.correctdomainname.com";
          } else {
                set req.backend = default;
          }
    }
    

    I'm working on the same thing right now so give it a try and let me know if it works for you.