diff --git a/.changeset/tall-berries-guess.md b/.changeset/tall-berries-guess.md new file mode 100644 index 000000000000..50abe8cfd22c --- /dev/null +++ b/.changeset/tall-berries-guess.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[breaking] Crawl rel="external" links when prerendering diff --git a/documentation/docs/07-a-options.md b/documentation/docs/07-a-options.md index b81d5afc7daf..356dc05fb971 100644 --- a/documentation/docs/07-a-options.md +++ b/documentation/docs/07-a-options.md @@ -43,3 +43,5 @@ Adding a `rel=external` attribute to a link... ``` ...will trigger a browser navigation when the link is clicked. + +> SvelteKit does not exclude root-relative external links from prerendering, which will cause 404s if these URLs are intended to be served by a separate app. Use a custom [`prerender.onError`](/docs/configuration#prerender) handler if you need to ignore them. diff --git a/packages/kit/src/core/adapt/prerender/crawl.js b/packages/kit/src/core/adapt/prerender/crawl.js index 8cf584cf77a5..8bcf72ac4a18 100644 --- a/packages/kit/src/core/adapt/prerender/crawl.js +++ b/packages/kit/src/core/adapt/prerender/crawl.js @@ -8,8 +8,6 @@ const TAG_OPEN = /[a-zA-Z]/; const TAG_CHAR = /[a-zA-Z0-9]/; const ATTRIBUTE_NAME = /[^\t\n\f />"'=]/; -const EXTERNAL = /\bexternal\b/; - const WHITESPACE = /[\s\n\r]/; /** @param {string} html */ @@ -88,7 +86,6 @@ export function crawl(html) { } } - let rel = ''; let href = ''; while (i < html.length) { @@ -149,9 +146,7 @@ export function crawl(html) { i -= 1; } - if (name === 'rel') { - rel = value; - } else if (name === 'href') { + if (name === 'href') { href = value; } else if (name === 'src') { hrefs.push(value); @@ -183,7 +178,7 @@ export function crawl(html) { i += 1; } - if (href && !EXTERNAL.test(rel)) { + if (href) { hrefs.push(href); } } diff --git a/packages/kit/src/core/adapt/prerender/fixtures/ignore-rel-external/output.json b/packages/kit/src/core/adapt/prerender/fixtures/ignore-rel-external/output.json deleted file mode 100644 index 75f29a134a4f..000000000000 --- a/packages/kit/src/core/adapt/prerender/fixtures/ignore-rel-external/output.json +++ /dev/null @@ -1 +0,0 @@ -["/styles.css", "/favicon.png", "https://external.com"] diff --git a/packages/kit/src/core/adapt/prerender/fixtures/ignore-rel-external/input.html b/packages/kit/src/core/adapt/prerender/fixtures/include-rel-external/input.html similarity index 100% rename from packages/kit/src/core/adapt/prerender/fixtures/ignore-rel-external/input.html rename to packages/kit/src/core/adapt/prerender/fixtures/include-rel-external/input.html diff --git a/packages/kit/src/core/adapt/prerender/fixtures/include-rel-external/output.json b/packages/kit/src/core/adapt/prerender/fixtures/include-rel-external/output.json new file mode 100644 index 000000000000..50b8dceed0d6 --- /dev/null +++ b/packages/kit/src/core/adapt/prerender/fixtures/include-rel-external/output.json @@ -0,0 +1 @@ +["/styles.css", "/favicon.png", "https://external.com", "/wheee"]