diff --git a/admin-server/gateway.go b/admin-server/gateway.go index f1f071e..3a3636a 100644 --- a/admin-server/gateway.go +++ b/admin-server/gateway.go @@ -259,7 +259,8 @@ func writeRouteServer(b *strings.Builder, cfg *GatewayConfig, r Route) error { if routeKind(r) == "portal" { // 门户首页交给 admin-server 渲染(pageInfo 可配置 + 支持数据卷整页覆盖), // 静态资源仍由本容器提供(root /app/portal)。 - b.WriteString(" root /app/portal;\n") + // 注意:不要在这里再写 root —— writeErrorPages 已经写过一次, + // 重复会让 nginx -t 报 "root directive is duplicate"(本轮真实踩到)。 b.WriteString(" location = / { proxy_pass http://127.0.0.1:3005/portal-page; proxy_set_header Host $host; proxy_redirect off; }\n") b.WriteString(" location / { try_files $uri $uri/ /404.html; }\n}\n\n") return nil diff --git a/admin-server/gateway_test.go b/admin-server/gateway_test.go index c404953..e41e5b6 100644 --- a/admin-server/gateway_test.go +++ b/admin-server/gateway_test.go @@ -2,6 +2,7 @@ package main import ( "os" + "strings" "testing" ) @@ -372,3 +373,14 @@ func TestPortalKindUsesRenderer(t *testing.T) { t.Fatalf("静态资源根目录丢失:\n%s", out) } } + +// nginx 不允许同一 server 段内重复的 root 指令(实测报 emerg)。 +func TestPortalKindNoDuplicateRoot(t *testing.T) { + out, err := RenderGatewayConf(&GatewayConfig{ListenPort: 8081, Routes: []Route{{Host: "p.com", Kind: "portal"}}}) + if err != nil { + t.Fatalf("渲染失败: %v", err) + } + if strings.Count(out, "root /app/portal;") != 1 { + t.Fatalf("root 指令重复(应恰好 1 次):\n%s", out) + } +}