Files
PixivFE/default.vcl
T
2024-10-09 15:00:32 +11:00

90 lines
3.1 KiB
Plaintext

vcl 4.1;
backend pixivfe {
.host = "pixivfe";
.port = "8282";
}
sub vcl_recv {
if (req.http.host == "caddy.localhost") {
set req.backend_hint = pixivfe;
# Step 1: Check for login status
if (req.http.cookie ~ "pixivfe-Token") {
set req.http.X-User-Logged-In = "true";
} else {
set req.http.X-User-Logged-In = "false";
}
# For logged-in users, include the token in the cache key
if (req.http.X-User-Logged-In == "true") {
set req.http.X-User-Token = regsub(req.http.cookie, ".*pixivfe-Token=([^;]+).*", "\1");
}
}
}
sub vcl_backend_response {
if (bereq.backend == pixivfe) {
# Step 2: Implement different caching strategies
# set grace to 1 minute globally
set beresp.grace = 1m;
## landing page; should be cached conservatively when it contains personalised content for logged in users, but be more aggressive for the shared page shown to anonymous visitors
if (bereq.url == "/") {
if (beresp.status == 200) {
if (bereq.http.X-User-Logged-In == "false") {
# Non-logged in users: cache for 8h
set beresp.ttl = 8h;
set beresp.http.Cache-Control = "public, max-age=28800";
} else {
# Logged in users: cache for 30 seconds, vary by user token
set beresp.ttl = 30s;
set beresp.uncacheable = false;
set beresp.http.Cache-Control = "private, max-age=30";
set beresp.http.Vary = "X-User-Token";
}
}
return (deliver);
}
## pages with user content that changes dynamically every request as per the Pixiv upstream; use a moderate caching strategy, we don't need to fetch new content *every* time
if (bereq.url ~ "^/discovery" || bereq.url ~ "^/discovery/novel" || bereq.url ~ "^/newest") {
if (beresp.status == 200) {
set beresp.ttl = 30s;
set beresp.uncacheable = false;
set beresp.http.Cache-Control = "public, max-age=30";
}
return (deliver);
}
## pages with user content that changes dynamically, but either over longer timeframes (ranking pages) or not appreciably (loading in under 100ms is probably more important than knowing the *exact* number of bookmarks a work has); we can be more aggressive
if (bereq.url ~ "^/ranking" || bereq.url ~ "^/rankingCalendar" || bereq.url ~ "^/artworks/" || bereq.url ~ "^/novel/" || bereq.url ~ "^/users/") {
if (beresp.status == 200) {
set beresp.ttl = 8h;
set beresp.http.Cache-Control = "public, max-age=28800";
}
return (deliver);
}
# proxied static media (images, short video, etc); a aggressive caching strategy is safe
if (bereq.url ~ "^/proxy/") {
if (beresp.status == 200) {
set beresp.ttl = 24h;
set beresp.http.Cache-Control = "public, max-age=31536000"; # 1 year
}
return (deliver);
}
# if nothing matches, be safe and dont cache anything
set beresp.http.Cache-Control = "private, no-store";
}
}
sub vcl_hash {
# Step 3: Include user token in hash for logged-in users
if (req.http.X-User-Logged-In == "true") {
hash_data(req.http.X-User-Token);
}
}