Redirect / to the main page instead of serving it in place

The served main page broke its own CSS and images when the entry point
was a nested page. kage saves each page's asset links as mirror-relative
paths (../_kage/...) computed for that page's own location, but the
handler served the main page's bytes directly at /, so the browser
resolved those relative URLs against / and 404ed every one of them. A
developer.apple.com/documentation mirror landed at / with no styles.

Redirect / to the main page's canonical content path, the way the
archive's W/mainPage redirect already does, so the browser navigates to
the page's real URL and resolves its relative assets correctly. Kiwix
was unaffected because it follows that redirect itself.
This commit is contained in:
Duc-Tam Nguyen
2026-06-15 22:46:42 +07:00
parent 2ccf7bc5db
commit 9eabd93098
2 changed files with 31 additions and 3 deletions
+18
View File
@@ -326,6 +326,24 @@ func TestHandler(t *testing.T) {
if code, body := get("/"); code != 200 || !bytes.Contains([]byte(body), []byte("Example Home")) {
t.Errorf("GET / = %d %.30q", code, body)
}
// "/" must redirect to the main page's canonical content path, not serve its
// bytes in place, so the page's mirror-relative asset URLs resolve against the
// right base instead of 404ing.
noFollow := &http.Client{CheckRedirect: func(*http.Request, []*http.Request) error {
return http.ErrUseLastResponse
}}
resp, err := noFollow.Get(srv.URL + "/")
if err != nil {
t.Fatal(err)
}
_ = resp.Body.Close()
if resp.StatusCode != http.StatusFound {
t.Errorf("GET / status = %d, want 302", resp.StatusCode)
}
if loc := resp.Header.Get("Location"); loc != "/index.html" {
t.Errorf("GET / Location = %q, want %q", loc, "/index.html")
}
if code, _ := get("/about/index.html"); code != 200 {
t.Errorf("GET /about/index.html = %d", code)
}