mirror of
https://codeberg.org/VnPower/PixivFE
synced 2024-12-06 19:16:23 +01:00
90 lines
3.1 KiB
Plaintext
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);
|
|
}
|
|
}
|