Search code examples
node.jshttp-redirectvarnishexpressvarnish-vcl

html redirects getting blocked while using varnish


I am using varnish 3.0 on ubuntu 11 - the redirect is being handled by expressjs(v2.5.8 - running node.js 0.6) - the redirect is called by express (works without varnish in between) but when varnish is used in between, the redirect to a new page gets blocked (displays 'Error 302 found').

In the vcl config file for varnish, I have attempted to pass(return) based on URL and Referer (in the sub vcl_recv section) but I appear to have misconfigured (or need to add more config steps). Any thoughts/suggestions for changes in the vcl file would be quite welcome which would allow varnish to let expressjs redirect to new page.

Thanks in advance.


Solution

  • Changing the sub_vcl_fetch fixed it.

    I have copied part of the sub_vcl_fetch section from my vcl file below:

    sub vcl_fetch {

    # Do not cache the object if the backend application does not want us to.
    if (beresp.http.Cache-Control ~ "(no-cache|no-store|private|must-revalidate)") {
    return(pass);
    }
    
    # Do not cache the object if the status is not in the 200s
    if (beresp.status >= 300) {
    # Remove the Set-Cookie header
    #remove beresp.http.Set-Cookie;
    return(pass);
    }
    
    #
    # Everything below here should be cached
    #
    # Remove the Set-Cookie header
    ####remove beresp.http.Set-Cookie;
    
    # Set the grace time
    set beresp.grace = 1s;
    
    # Static assets aren't served out of Varnish just yet, but when they are, this will
    # make sure the browser caches them for a long time.
    if (req.url ~ "\.(css|js|jpg|jpeg|gif|ico|png)\??\d*$") {
    /* Remove Expires from backend, it's not long enough */
    unset beresp.http.expires;
    
    /* Set the clients TTL on this object */
    set beresp.http.cache-control = "public, max-age=31536000";
    
    /* marker for vcl_deliver to reset Age: */
    set beresp.http.magicmarker = "1";} else {
    set beresp.http.Cache-Control = "private, max-age=0, must-revalidate";
    set beresp.http.Pragma = "no-cache";}
    
    ## If the request to the backend returns a code other than 200, restart the loop
    ## If the number of restarts reaches the value of the parameter max_restarts,
    ## the request will be error'ed.  max_restarts defaults to 4.  This prevents
    ## an eternal loop in the event that, e.g., the object does not exist at all.
    if (beresp.status != 200 && beresp.status != 403 && beresp.status != 404) {
    restart;
    }
    
    
    if (beresp.status == 302) {
    return(deliver);}
    # return(deliver); the object
    return(deliver);
    }
    

    Hope this helps!