[英]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.