簡體   English   中英

服務器端緩存Joomfish(清漆)

[英]Server side caching Joomfish (varnish)

有誰知道我如何繞過Joomfish,需要一個cookie來設置和保留joomla網站的語言。

我必須為繼承的站點使用服務器端緩存,因為它的構造方式非常慢且服務器密集型。 我無法對其進行重組,因為這將是進行大量重建的方式。

問題是JoomFish會設置cookie來確定用戶的語言。 該Cookie被緩存或未設置。 這意味着用戶僅會獲得受干擾的語言站點,而不是他們選擇的語言。

我正在使用Varnish 3進行服務器端緩存。 Joomla 2.5和Joomfish 2.5.1

我的VCL是:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}
acl purge {
    "127.0.0.1";
    "192.168.0.0"/24;
}

sub vcl_recv {

    # Set up purging cache
    if(req.request == "PURGE") {
        if (!client.ip ~ purge) {
          error 405 "Method not allowed";
        }
        return (lookup);
    }

    # Forward client's IP to backend
    remove req.http.X-Forwarded-For;
    set req.http.X-Forwarded-For = client.ip;

    # Proxy (pass) any request that goes to the backend admin,
    # the banner component links or any post requests
    # You can add more pages or entire URL structure in the end of the "if"

    if(req.http.cookie ~ "userID" || req.url ~ "^/administrator" || req.url ~ "^/component/banners" || req.request == "POST") {
        return (pipe);
    }

    # Check for the custom "x-logged-in" header to identify if the visitor is a guest,
    # then unset any cookie (including session cookies) provided it's not a POST request
    if(req.http.x-logged-in == "False" && req.request != "POST"){
        unset req.http.cookie;
    }

    # Properly handle different encoding types
    if (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") {
            # No point in compressing these
            remove req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            # unknown algorithm (aka crappy browser)
            remove req.http.Accept-Encoding;
        }
    }

    # Cache files with these extensions
    if (req.url ~ "\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") {
        return (lookup);
    }

    # Set how long Varnish will cache content depending on whether your backend is healthy or not
    if (req.backend.healthy) {
        set req.grace = 5m;
    } else {
        set req.grace = 1h;
    }

    return (lookup);
}

sub vcl_fetch {

    # Check for the custom "x-logged-in" header to identify if the visitor is a guest,
    # then unset any cookie (including session cookies) provided it's not a POST request
    if(req.request != "POST" && beresp.http.x-logged-in == "False") {
        unset beresp.http.Set-Cookie;
    }

    # Allow items to be stale if needed (this value should be the same as with "set req.grace"
    # inside the sub vcl_recv {…} block (the 2nd part of the if/else statement)
    set beresp.grace = 1h;

    # Serve pages from the cache should we get a sudden error and re-check in one minute
    if (beresp.status == 503 || beresp.status == 502 || beresp.status == 501 || beresp.status == 500) {
        set beresp.grace = 60s;
        return (restart);
    }

    # Unset the "etag" header (suggested)
    unset beresp.http.etag;

    # This is Joomla! specific: fix stupid "no-cache" header sent by Joomla! even
    # when caching is on - make sure to replace 300 with the number of seconds that
    # you want the browser to cache content
    if(beresp.http.Cache-Control == "no-cache" || beresp.http.Cache-Control == ""){
        set beresp.http.Cache-Control = "max-age=300, public, must-revalidate";
    }

    # This is how long Varnish will cache content
    set beresp.ttl = 15m;

    return (deliver);
}

sub vcl_hit {
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged";
    }
}

sub vcl_miss {
    if (req.request == "PURGE") {
        purge;
        error 404 "Not in cache";
    }
}
sub vcl_pass {
    if (req.request == "PURGE") {
        error 502 "PURGE on a passed object";
    }
}

我現在已經弄清楚了。 對於其他任何遇到相同問題的人。 您只需將joomfish cookie的值傳遞給服務器即可。 例如:

sub vcl_recv {  
    if(req.http.cookie ~ "jfcookie\[lang\]=fr"){
        return (pass);
    }
}

這將確保法語用戶收到法語站點。 雖然還沒有找到單獨緩存法語站點的方法。 顯然,您可以對哈希執行某些操作。 我現在正在尋找的是找到我的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM