Làm sao để không bị cache khi chuyển đổi tiền tệ

Thảo luận trong 'Installing Magento 2' bắt đầu bởi hoangsuu, 24 Tháng mười hai 2016.

  1. hoangsuu

    hoangsuu New Member

    Chào các bạn!
    Mình cài magento 2.1.x và sử dụng varnish cache. Mình cấu hình varnish ok rồi nhưng mình gặp phải một lỗi. Đó là mỗi khi mình chuyển đổi tiền tệ từ USD sang VNĐ và ngược lại đều bị cache (site mình dùng 2 tiền tệ, mặc định là USD, dùng rate để switch.
    Ví dụ khi lần đầu truy cập vào là đồng USD, load site thành công và mình chuyển sang VNĐ thì nó vẫn dùng kết quả khi load site ở USD.
    Các bạn có cách nào hay ai đã từng gặp sự cố này rồi giúp mình với ạ! Cảm ơn nhiều!
    Mình đã thử cài GeoIP Vmod nhưng không ăn thua, hay do mình cấu hình cái này không đúng hic.
    Đây là file cấu hình varnish-default của mình:
    Mã:
    sub vcl_recv {
    if (req.http.Cookie ~ "\bcurrent_country=") {
                set req.http.X-Varnish-Currentcountry = regsub(
                    req.http.Cookie, ".*\bcurrent_country=([^;]*).*", "\1");
            }
            if (req.http.Cookie ~ "\currency") {
                set req.http.X-Varnish-Currency = regsub(
                    req.http.Cookie, ".*\currency([^;]*).*", "\1");
            }
    # Check if our magic cookie not present in request
      if (req.http.Cookie !~ "MagicCookie") {
              # Extract country code
              set req.http.X-Country-Code = geoip.country_code("" + client.ip);
    
              # Set some value for United Kingdom and Ireland
              if (req.http.X-Country-Code ~ "(us|vn)") {
                  set req.http.Cookie = "MagicCookie=XXX;" + req.http.Cookie;
              }
              # Some other value for USA and VN
              elsif (req.http.X-Country-Code ~ "(us|vn)") {
                  set req.http.Cookie = "MagicCookie=YYY;" + req.http.Cookie;
              }
              # And something completely different for all other world
              else {
                  set req.http.Cookie = "MagicCookie=ZZZ;" + req.http.Cookie;
              }
      }
    
        if (req.method == "PURGE") {
            if (client.ip !~ purge) {
                return (synth(405, "Method not allowed"));
            }
            if (!req.http.X-Magento-Tags-Pattern) {
                return (synth(400, "X-Magento-Tags-Pattern header required"));
            }
            ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
            return (synth(200, "Purged"));
        }
    
         if (req.url ~ "^/directory/currency/") {
      return (pass);
    }
    
        if (req.method != "GET" &&
            req.method != "HEAD" &&
            req.method != "PUT" &&
            req.method != "POST" &&
            req.method != "TRACE" &&
            req.method != "OPTIONS" &&
            req.method != "DELETE") {
              /* Non-RFC2616 or CONNECT which is weird. */
              return (pipe);
        }
    
        # We only deal with GET and HEAD by default
        if (req.method != "GET" && req.method != "HEAD") {
            return (pass);
        }
    
        return (hash);
    
    }
    
    #sub vcl_hash {  
    #    if (req.http.cookie ~ "X-Magento-Vary=") {
    #        hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
    #    }   
    #    {{ design_exceptions_code }}
    #}
    
    sub vcl_backend_response {
        if (beresp.http.content-type ~ "text") {
            set beresp.do_esi = true;
        }
    
        if (bereq.url ~ "\.js$" || beresp.http.content-type ~ "text") {
            set beresp.do_gzip = true;
        }
    
        # cache only successfully responses
        if (beresp.status != 200) {
            set beresp.ttl = 0s;
            set beresp.uncacheable = true;
            return (deliver);
        } elsif (beresp.http.Cache-Control ~ "private") {
            set beresp.uncacheable = true;
            set beresp.ttl = 120s;
            return (deliver);
        }
    
        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 && (bereq.method == "GET" || bereq.method == "HEAD")) {
            unset beresp.http.set-cookie;
            if (bereq.url !~ "\.(css|js|jpg|png|gif|tiff|bmp|gz|tgz|bz2|tbz|mp3|ogg|svg|swf|woff)(\?|$)") {
                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;
            }
        }
        return (deliver);
    }
    
    sub vcl_deliver {
        if (obj.hits > 0) {
          set resp.http.X-Cache = "HIT";
        } else {
          set resp.http.X-Cache = "MISS";
        }
        set resp.http.Access-Control-Allow-Origin = "*";
        set resp.http.Server = "Hang My Company";
    
        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;
    }
    sub vcl_synth {
        if (resp.status == 301 || resp.status == 302) {
            set resp.http.location = resp.reason;
            set resp.reason = "Moved";
            return (deliver);
        }
    }

    Bài viết khác cùng chuyên mục:

  2. admin

    admin Mai Văn Hải Staff Member

    Bạn thử tắt cahe cho static block xem nhé.

    và check lại config cache, action xảy ra là ko update block này.
  3. hoangsuu

    hoangsuu New Member

    Nếu mình tắt Full Page Cache thì ok. Nhưng mà nếu tắt như này thì đồng nghĩa với Varnish không hoạt động.
    Bạn nói rõ hơn mình cần check chỗ nào trong cấu hình cache với ạ! Hic

Chia sẻ trang này