An SEO-less site's robots.txt, sitemap.xml and llms.txt keep reaching
the app during an outage longer than the cache TTL; a backend that never
answered still gets the 503.
quick-261104-xae, review WR-04.
- rootFileTargets gives robots.txt, sitemap.xml and llms.txt their backend
target also in state unknown without a last answer, so the failing fetch
answers 503 with Retry-After: 60 instead of the app's 404 (L4 WR-08)
- an older backend (absent) still passes through; sitemap files and
verification files still need a site answer
- expect-seo-down.txt expects the 503s and states the staging reason
- seoSitemapPages (lib/sitemapPages.ts) builds the routes per locale; the
module adds them from a pages:resolved hook registered on ready, after
@nuxtjs/i18n has localised the app's routes, so no cross-locale copies
exist and each name ends in the locale's i18n suffix (L4 WR-05)
- a path an app catch-all covers is left to it and logged at build unless
seo.htmlSitemap.overCatchAll is true (L4 WR-04)
- SitemapLink falls back to the i18n locale and renders only when the path
resolves to the layer's sitemap page of that locale
- an app with only app.vue no longer gets its router turned on by the pages
- noindexStaticRoutes: requiresAuth, noindex/none seo.robots and static
pages under seo.noindexRoutes, i18n copies included, never patterns or
the layer's HTML sitemap pages (G1, gap-2 contract)
- #seo-routes exports noindexPaths; routeReportBody(paths, noindex) answers
{routes, noindex} with the same limits and keeps the JSON body within the
older plugin's 4,113,024 bytes, dropping noindex entries first
- smoke grammar noindex= and lacksnoindex=; README carries the contract
With prefix_except_default (or prefix_and_default) @nuxtjs/i18n adds a copy
of every page per other locale (/pl/contact next to /contact). The route
report sent them as pages of their own, so the CMS registry got a second,
untranslated page for each. They are the page's translations: the report
now skips routes named with another locale's suffix (contact___pl).
- autolink, applyOutbound and imageAttrs: the body link rules a content
layer runs at SSR on sanitized HTML (UI-SPEC L7)
- htmlSitemap: an app without pages sets false, since the sitemap pages
would turn the router on
- the purge route's copies in the journal, menu and FAQ layers are gone
- README: build guard, noindex routes and page meta keys, route report,
drift check, the new module options, the Components section
(SeoBreadcrumbs, SeoPagination, usePagination, the HTML sitemap pages
and their override, SeoSitemapLink), useSeoSite and the new helpers,
guard:check and the new smoke grammar
With the SEO backend unreachable since start, /robots.txt and /sitemap.xml
answered 503 where v0.1.1 left them to the app (a consumer's smoke expects
the app's 404). The root proxies now need a site answer; the last one seen
is kept while the backend is down, so a failure after it is still 503.
- options (cms alias of public.seo.enabled, breadcrumbs, links.newTabHint,
rootFiles, resolveFiles), the new runtime keys and the moved purge keys
- the resolve and site answer contract, one JSON-LD graph, root files,
the purge route, 404 report, labels and tokens, the smoke runs