{"record":{"id":"111b7d64af71aa5c","repo":"withastro/astro","slug":"prerenderclientaddressnotavailable","errorCode":"PrerenderClientAddressNotAvailable","errorMessage":"`Astro.clientAddress` cannot be used inside prerendered route ${name}.","messagePattern":"`Astro\\.clientAddress` cannot be used inside prerendered route (.+?)\\.","errorType":"exception","errorClass":"AstroError","httpStatus":null,"severity":"error","filePath":"packages/astro/src/core/fetch/fetch-state.ts","lineNumber":592,"sourceCode":"\t\t\t\t\t},\n\t\t\t\t\terror(msg: string) {\n\t\t\t\t\t\tpipeline.logger.error(null, msg);\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\n\t\tthis.defineProviderGetters(partial);\n\n\t\treturn partial as Omit<AstroGlobal, 'props' | 'self' | 'slots'>;\n\t}\n\n\tgetClientAddress(): string {\n\t\tconst { pipeline, clientAddress } = this;\n\t\tconst routeData = this.routeData!;\n\n\t\tif (routeData.prerender) {\n\t\t\tthrow new AstroError({\n\t\t\t\t...AstroErrorData.PrerenderClientAddressNotAvailable,\n\t\t\t\tmessage: AstroErrorData.PrerenderClientAddressNotAvailable.message(routeData.component),\n\t\t\t});\n\t\t}\n\n\t\tif (clientAddress) {\n\t\t\treturn clientAddress;\n\t\t}\n\n\t\tif (pipeline.adapterName) {\n\t\t\tthrow new AstroError({\n\t\t\t\t...AstroErrorData.ClientAddressNotAvailable,\n\t\t\t\tmessage: AstroErrorData.ClientAddressNotAvailable.message(pipeline.adapterName),\n\t\t\t});\n\t\t}\n\n\t\tthrow new AstroError(AstroErrorData.StaticClientAddressNotAvailable);\n\t}","sourceCodeStart":574,"sourceCodeEnd":610,"githubUrl":"https://github.com/withastro/astro/blob/d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca/packages/astro/src/core/fetch/fetch-state.ts#L574-L610","documentation":"Thrown by Astro.clientAddress getter when the current route is prerendered (static) at build time. Prerendered pages run at build with no real HTTP request, so there is no client IP to read. The check is routeData.prerender being true inside getClientAddress().","triggerScenarios":"Accessing Astro.clientAddress inside a .astro page or endpoint that has `export const prerender = true`, or a route that became prerendered because output is 'static'. The getter on the page-level Astro global calls state.getClientAddress(), which throws when routeData.prerender is true.","commonSituations":"Adding prerender = true to a page that logs or analytics-tracks visitor IPs; switching a project from output 'server' to 'static' and forgetting to remove clientAddress usage; reading clientAddress in a shared component imported by a prerendered page.","solutions":["Remove `export const prerender = true` from the page (or set output: 'server') so the route is server-rendered.","Guard access: only read Astro.clientAddress when the route is on-demand, e.g. wrap in a check or move the IP-dependent code to a server-rendered endpoint.","If the page must be prerendered, capture the client address at runtime via a separate server-rendered API route or adapter middleware and pass it in."],"exampleFix":"// before\nexport const prerender = true;\nconst ip = Astro.clientAddress;\n\n// after\nexport const prerender = false;\nconst ip = Astro.clientAddress;","handlingStrategy":"validation","validationCode":"// Only read clientAddress on server-rendered routes.\nconst prerender =\n  (Astro as any).routeData?.prerender ??\n  (import.meta as any).env?.PRERENDER === true;\nconst ip = !prerender ? Astro.clientAddress : undefined;","typeGuard":"function isServerRendered(routeData: { prerender?: boolean } | undefined): boolean {\n  return routeData?.prerender !== true;\n}","tryCatchPattern":"let ip: string | undefined;\ntry {\n  ip = Astro.clientAddress;\n} catch (e) {\n  if (e instanceof Error && /prerendered route/i.test(e.message)) {\n    ip = undefined; // expected on prerendered pages\n  } else throw e;\n}","preventionTips":["Do not read Astro.clientAddress in components imported by prerendered pages.","Keep IP-reading logic in dedicated server-rendered endpoints.","Audit usages when switching output from server to static."],"tags":["clientaddress","prerender","ssr","routing"],"backgroundTag":null,"analyzedSha":"d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca","analyzedAt":"2026-08-12T13:37:29.035Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}