5

Well first of all i am using the Porto theme and using the SW mega menu. I'm currently running magento 2.0.4.

It seems that when i turn on varnish on my webhost and configure everything that it is working except it is not showing my top navigation menu. For some reason i think the mega menu vs Varnish causes this.

My Current VCL file :

# The minimal Varnish version is 3.0.5

backend default {
    .host = "176.62.167.144";
    .port = "10175"; }

acl purge {
    "176.62.167.144"; }

sub vcl_recv {
    if (req.restarts == 0) {
        if (req.http.x-forwarded-for) {
            set req.http.X-Forwarded-For =
            req.http.X-Forwarded-For + ", " + client.ip;
        } else {
            set req.http.X-Forwarded-For = client.ip;
        }
    }

    if (req.request == "PURGE") {
        if (client.ip !~ purge) {
            error 405 "Method not allowed";
        }
        if (!req.http.X-Magento-Tags-Pattern) {
            error 400 "X-Magento-Tags-Pattern header required";
        }
        ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
        error 200 "Purged";
    }

    if (req.request != "GET" &&
        req.request != "HEAD" &&
        req.request != "PUT" &&
        req.request != "POST" &&
        req.request != "TRACE" &&
        req.request != "OPTIONS" &&
        req.request != "DELETE") {
          /* Non-RFC2616 or CONNECT which is weird. */
          return (pipe);
    }

    # We only deal with GET and HEAD by default
    if (req.request != "GET" && req.request != "HEAD") {
        return (pass);
    }

    # Bypass shopping cart and checkout requests
    if (req.url ~ "/checkout") {
        return (pass);
    }

    # normalize url in case of leading HTTP scheme and domain
    set req.url = regsub(req.url, "^http[s]?://", "");

    # collect all cookies
    std.collect(req.http.Cookie);

    # static files are always cacheable. remove SSL flag and cookie
    if (req.url ~ "^/(pub/)?(media|static)/.*\.(ico|css|js|jpg|jpeg|png|gif|tiff|bmp|gz|tgz|bz2|tbz|mp3|ogg|svg|swf|woff|woff2|eot|ttf|otf)$") {
        unset req.http.Https;
        unset req.http.Cookie;
    }

    set req.grace = 1m;

    return (lookup); }

sub vcl_hash {
    if (req.http.cookie ~ "X-Magento-Vary=") {
        hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
    }
     }

sub vcl_fetch {
    if (beresp.http.content-type ~ "text") {
        set beresp.do_esi = true;
    }

    if (req.url ~ "\.js$" || beresp.http.content-type ~ "text") {
        set beresp.do_gzip = true;
    }

    # cache only successfully responses and 404s
    if (beresp.status != 200 && beresp.status != 404) {
        set beresp.ttl = 0s;
        return (hit_for_pass);
    } elsif (beresp.http.Cache-Control ~ "private") {
        return (hit_for_pass);
    }

    if (beresp.http.X-Magento-Debug) {
        set beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
    }

    # validate if we need to cache it and prevent from setting cookie
    # images, css and js are cacheable by default so we have to remove cookie also
    if (beresp.ttl > 0s && (req.request == "GET" || req.request == "HEAD")) {
        unset beresp.http.set-cookie;
            if (req.url !~ "\.(ico|css|js|jpg|jpeg|png|gif|tiff|bmp|mp3|ogg|svg|swf|woff|woff2|eot|ttf|otf)(\?|$)") {
            set beresp.http.Pragma = "no-cache";
            set beresp.http.Expires = "-1";
            set beresp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0";
            set beresp.grace = 1m;
        }
    } }

sub vcl_deliver {
    if (resp.http.X-Magento-Debug) {
        if (obj.hits > 0) {
            set resp.http.X-Magento-Cache-Debug = "HIT";
        } else {
            set resp.http.X-Magento-Cache-Debug = "MISS";
        }
    } else {
        unset resp.http.Age;
    }

    unset resp.http.X-Magento-Debug;
    unset resp.http.X-Magento-Tags;
    unset resp.http.X-Powered-By;
    unset resp.http.Server;
    unset resp.http.X-Varnish;
    unset resp.http.Via;
    unset resp.http.Link; }

Does anyone has an idea how i can adjust this so my menu appears while varnish is turned on?

Everything works when Varnish is not on in the backend of magento.

9

I had the same issue, I found a solution for this.

I just removed the ttl attribute from /vendor/magento/module-theme/view/frontend/layout/default.xml and the menu bar appeared again.

  • thanks great answer! solved issue on prod..but any technical explanation for this? – huzefam Aug 9 '17 at 19:01
  • how to i override in custom theme? – huzefam Aug 9 '17 at 19:07
  • 1
    This does not solve the problem. It just removes the block from the esi:include. Is there a way to let the block in there, but still make it work properly? – Marius Sep 21 '17 at 13:53
  • Why is this happening in the first place? Any way to leave the TTL in there and make it work? – Erfan Jan 29 '18 at 17:23
  • @Amit Naraniwala i am facing same issue magento.stackexchange.com/questions/229527/… is there any problem if i remove ttl attribute? – Chirag Patel Sep 26 '18 at 5:58
0

Since I'm not using HTTPS, I just put in http://www.versdivers.be in my secure base URL and this fixed the problem.

If you are using HTTPS then you will need to do what Khoa posted:

http://github.com/magento/magento2/issues/3897 – Khoa TruongDinh yesterday

0

I removed all ttl attributes in app\code\Magestore\Megamenu\view\frontend\layout\default.xml and menu showed up

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.