mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-03 15:06:36 +08:00
perf(cache): 边缘缓存对齐 Cloudflare 默认模型
This commit is contained in:
@@ -490,16 +490,16 @@ func renderRouteCacheBlock(cacheConfig routeCacheConfig, cfg ConfigSnapshot) str
|
||||
var builder strings.Builder
|
||||
builder.WriteString(" set $openflare_skip_cache 0;\n")
|
||||
builder.WriteString(" if ($request_method != GET) {\n set $openflare_skip_cache 1;\n }\n")
|
||||
builder.WriteString(" if ($http_authorization != \"\") {\n set $openflare_skip_cache 1;\n }\n")
|
||||
builder.WriteString(" if ($http_cookie ~* \"(session|sess|token|auth|jwt|logged_in|remember|laravel_session|connect\\\\.sid|_session)\") {\n set $openflare_skip_cache 1;\n }\n")
|
||||
builder.WriteString(" if ($http_cache_control ~* \"(no-cache|no-store|private)\") {\n set $openflare_skip_cache 1;\n }\n")
|
||||
if condition := renderRouteCachePolicyCondition(cacheConfig); condition != "" {
|
||||
builder.WriteString(condition)
|
||||
}
|
||||
builder.WriteString(" proxy_cache openflare_cache;\n")
|
||||
builder.WriteString(" proxy_cache_methods GET;\n")
|
||||
builder.WriteString(" proxy_cache_bypass $openflare_skip_cache;\n")
|
||||
builder.WriteString(" proxy_no_cache $openflare_skip_cache;\n")
|
||||
builder.WriteString(" proxy_no_cache $openflare_skip_cache $upstream_http_set_cookie;\n")
|
||||
builder.WriteString(" proxy_cache_valid 200 206 301 120m;\n")
|
||||
builder.WriteString(" proxy_cache_valid 302 303 20m;\n")
|
||||
builder.WriteString(" proxy_cache_valid 404 410 3m;\n")
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
|
||||
@@ -407,11 +407,18 @@ func TestRenderRouteCachePolicyConditionStaticDefault(t *testing.T) {
|
||||
if !strings.Contains(staticBlock, "css") || !strings.Contains(staticBlock, "woff2") {
|
||||
t.Fatalf("static policy should include default extensions, got:\n%s", staticBlock)
|
||||
}
|
||||
if !strings.Contains(staticBlock, "map") || !strings.Contains(staticBlock, "mjs") {
|
||||
t.Fatalf("static policy should include map and mjs, got:\n%s", staticBlock)
|
||||
}
|
||||
if strings.Contains(staticBlock, "html") {
|
||||
t.Fatalf("static policy must not include html, got:\n%s", staticBlock)
|
||||
}
|
||||
// Pattern is \.(?:css|js|...)$ — reject bare "json" as an alternation token.
|
||||
if strings.Contains(staticBlock, "|json|") || strings.Contains(staticBlock, "|json)") || strings.Contains(staticBlock, "(?:json|") {
|
||||
t.Fatalf("static policy must not include json (CF default), got:\n%s", staticBlock)
|
||||
}
|
||||
|
||||
// Legacy empty/url = all (wide cache after security bypass).
|
||||
// Legacy empty/url = all (wide cache after method bypass).
|
||||
emptyPolicy := renderRouteCachePolicyCondition(routeCacheConfig{Enabled: true, Policy: ""})
|
||||
if emptyPolicy != "" {
|
||||
t.Fatalf("empty policy should map to all (no path filter), got %q", emptyPolicy)
|
||||
@@ -427,7 +434,7 @@ func TestRenderRouteCachePolicyConditionStaticDefault(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRenderRouteCacheBlockIncludesStaticWhenEnabled(t *testing.T) {
|
||||
func TestRenderRouteCacheBlockAlignsCloudflareDefaults(t *testing.T) {
|
||||
block := renderRouteCacheBlock(
|
||||
routeCacheConfig{Enabled: true, Policy: "static"},
|
||||
ConfigSnapshot{CacheEnabled: true},
|
||||
@@ -439,7 +446,31 @@ func TestRenderRouteCacheBlockIncludesStaticWhenEnabled(t *testing.T) {
|
||||
t.Fatalf("expected static suffix pattern, got:\n%s", block)
|
||||
}
|
||||
if !strings.Contains(block, "request_method != GET") {
|
||||
t.Fatalf("expected security bypass for non-GET, got:\n%s", block)
|
||||
t.Fatalf("expected method bypass for non-GET, got:\n%s", block)
|
||||
}
|
||||
if strings.Contains(block, "$http_authorization") {
|
||||
t.Fatalf("must not bypass on Authorization (CF-aligned), got:\n%s", block)
|
||||
}
|
||||
if strings.Contains(block, "$http_cookie") {
|
||||
t.Fatalf("must not bypass on Cookie (CF-aligned), got:\n%s", block)
|
||||
}
|
||||
if strings.Contains(block, "$http_cache_control") {
|
||||
t.Fatalf("must not bypass on request Cache-Control (CF-aligned), got:\n%s", block)
|
||||
}
|
||||
if !strings.Contains(block, "proxy_no_cache $openflare_skip_cache $upstream_http_set_cookie") {
|
||||
t.Fatalf("expected Set-Cookie no-cache gate, got:\n%s", block)
|
||||
}
|
||||
if !strings.Contains(block, "proxy_cache_valid 200 206 301 120m") {
|
||||
t.Fatalf("expected default Edge TTL for 200/206/301, got:\n%s", block)
|
||||
}
|
||||
if !strings.Contains(block, "proxy_cache_valid 302 303 20m") {
|
||||
t.Fatalf("expected default Edge TTL for 302/303, got:\n%s", block)
|
||||
}
|
||||
if !strings.Contains(block, "proxy_cache_valid 404 410 3m") {
|
||||
t.Fatalf("expected default Edge TTL for 404/410, got:\n%s", block)
|
||||
}
|
||||
if !strings.Contains(block, "proxy_cache_bypass $openflare_skip_cache") {
|
||||
t.Fatalf("expected proxy_cache_bypass on skip flag only, got:\n%s", block)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,9 +37,9 @@ const (
|
||||
)
|
||||
|
||||
// DefaultStaticCacheExtensions is the built-in suffix allowlist for cache_policy=static.
|
||||
// HTML is intentionally excluded (Cloudflare-like default).
|
||||
// HTML and JSON are excluded (Cloudflare default). map/mjs/wasm are intentional extras.
|
||||
var DefaultStaticCacheExtensions = []string{
|
||||
"css", "js", "mjs", "map", "json",
|
||||
"css", "js", "mjs", "map",
|
||||
"ico", "cur", "gif", "jpg", "jpeg", "png", "webp", "avif", "svg", "svgz",
|
||||
"ttf", "otf", "woff", "woff2", "eot",
|
||||
"mp3", "mp4", "webm", "ogg", "flac",
|
||||
|
||||
Reference in New Issue
Block a user