有没有人知道如何绕过Joomfish需要一个cookie来设置和保留joomla网站的语言。
我必须对我继承的站点使用服务器端缓存,因为它的构造方式非常慢且服务器密集。我无法对其进行重组,因为这样可以重建多少。
问题是JoomFish设置cookie以确定用户的语言。该cookie被缓存或取消设置。这意味着用户只能获得chached语言站点而不是他们选择的语言。
我使用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";
}
}
答案 0 :(得分:1)
我现在想出来了。对于任何遇到同样问题的人。您只需将joomfish cookie的值传递给服务器即可。例如:
sub vcl_recv {
if(req.http.cookie ~ "jfcookie\[lang\]=fr"){
return (pass);
}
}
这将确保法国用户收到法国网站。虽然没有想出一种单独缓存法语网站的方法。显然你可以用哈希做点什么。这就是我现在正在研究的内容,如果找到解决方案,我会发布解决方案。