Fix resolution of page by resolving site redirects before space redirects (#3414)

This commit is contained in:
Taran Vohra
2025-07-02 17:30:18 +05:30
committed by GitHub
parent e8fb84d362
commit e2afc07ab2
2 changed files with 24 additions and 20 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"gitbook": patch
---
Fix resolution of page by resolving site redirects before space redirects
@@ -53,27 +53,12 @@ async function resolvePage(context: GitBookSiteContext, params: PagePathParams |
// We don't test path that are too long as GitBook doesn't support them and will return a 404 anyway.
if (rawPathname.length <= 512) {
// If page can't be found, we try with the API, in case we have a redirect at space level.
// We use the raw pathname to handle special/malformed redirects setup by users in the GitSync.
// The page rendering will take care of redirecting to a normalized pathname.
const resolved = await getDataOrNull(
context.dataFetcher.getRevisionPageByPath({
spaceId: space.id,
revisionId: revisionId,
path: rawPathname,
})
);
if (resolved) {
return resolvePageId(revision.pages, resolved.id);
}
// If a page still can't be found, we try with the API, in case we have a redirect at site level.
// Duplicated the regex pattern from SiteRedirectSourcePath API type.
const SITE_REDIRECT_SOURCE_PATH_REGEX =
/^\/(?:[A-Za-z0-9\-._~]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~]|%[0-9A-Fa-f]{2})+)*$/;
const redirectPathname = withLeadingSlash(rawPathname);
if (
/^\/(?:[A-Za-z0-9\-._~]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~]|%[0-9A-Fa-f]{2})+)*$/.test(
redirectPathname
)
) {
// If a page can't be found, we try with the API, in case we have a redirect at site level.
if (SITE_REDIRECT_SOURCE_PATH_REGEX.test(redirectPathname)) {
const redirectSources = new Set<string>([
// Test the pathname relative to the root
// For example hello/world -> section/variant/hello/world
@@ -98,6 +83,20 @@ async function resolvePage(context: GitBookSiteContext, params: PagePathParams |
}
}
}
// If page still can't be found, we try with the API, in case we have a redirect at space level.
// We use the raw pathname to handle special/malformed redirects setup by users in the GitSync.
// The page rendering will take care of redirecting to a normalized pathname.
const resolved = await getDataOrNull(
context.dataFetcher.getRevisionPageByPath({
spaceId: space.id,
revisionId: revisionId,
path: rawPathname,
})
);
if (resolved) {
return resolvePageId(revision.pages, resolved.id);
}
}
return undefined;