2014-02-06 141 views
1

有沒有人有任何想法我可以繞過Joomfish需要cookie來設置和保留一個joomla網站的語言。服務器端緩存Joomfish(清漆)

我必須使用服務器端緩存爲我繼承的網站,因爲它的構建方式是愚蠢的緩慢和服務器密集型。我無法對它進行重組,因爲這將導致重建。

問題是JoomFish設置了一個cookie來確定用戶的語言。該cookie被緩存或取消設置。這意味着用戶只能獲得chached語言網站而不是他們選擇的語言。

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

我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"; 
    } 
} 
+0

您的VCL的外觀如何? –

+0

根據要求添加上面 – DavidT

回答

1

現在我已經想通了這一點。對於任何其他人遇到同樣的問題。您可以簡單地傳遞給服務器上的joomfish cookie的值。例如:

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

這將確保法國用戶收到法國網站。儘管如此,還沒有想出一種方法來分別緩存法國網站。顯然你可以用哈希做一些事情。我現在正在研究的是哪一個,如果找到解決方案就會發布解決方案。