[{"data":1,"prerenderedAt":2181},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"blog-post-/blog/fix-nuxt-content-404-en":444,"blog-post-surround-/blog/fix-nuxt-content-404-en":2175},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","/docs/landing","0.docs/1.landing/001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","/docs/landing/built-in-features","0.docs/1.landing/002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","/docs/landing/content","0.docs/1.landing/02.content/1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","/docs/landing/content/details","0.docs/1.landing/02.content/2.details",{"title":24,"path":25,"stem":26},"Technical","/docs/landing/content/technical","0.docs/1.landing/02.content/4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","/docs/landing/regional","0.docs/1.landing/03.regional/1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"/docs/landing/regional/details","0.docs/1.landing/03.regional/2.details",{"title":24,"path":38,"stem":39},"/docs/landing/regional/technical","0.docs/1.landing/03.regional/4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","/docs/landing/multilang","0.docs/1.landing/04.multilang/1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"/docs/landing/multilang/details","0.docs/1.landing/04.multilang/2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","/docs/landing/blog","0.docs/1.landing/05.blog/1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"/docs/landing/blog/details","0.docs/1.landing/05.blog/2.details",{"title":24,"path":61,"stem":62},"/docs/landing/blog/technical","0.docs/1.landing/05.blog/4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","/docs/landing/docs","0.docs/1.landing/06.docs/1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"/docs/landing/docs/details","0.docs/1.landing/06.docs/2.details",{"title":24,"path":74,"stem":75},"/docs/landing/docs/technical","0.docs/1.landing/06.docs/4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","/docs/landing/forms","0.docs/1.landing/07.forms/1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"/docs/landing/forms/details","0.docs/1.landing/07.forms/2.details",{"title":87,"path":88,"stem":89},"Admin","/docs/landing/forms/admin","0.docs/1.landing/07.forms/3.admin",{"title":24,"path":91,"stem":92},"/docs/landing/forms/technical","0.docs/1.landing/07.forms/4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","/docs/landing/email","0.docs/1.landing/08.email/1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"/docs/landing/email/details","0.docs/1.landing/08.email/2.details",{"title":87,"path":104,"stem":105},"/docs/landing/email/admin","0.docs/1.landing/08.email/3.admin",{"title":24,"path":107,"stem":108},"/docs/landing/email/technical","0.docs/1.landing/08.email/4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","/docs/landing/feedback","0.docs/1.landing/09.feedback/1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"/docs/landing/feedback/details","0.docs/1.landing/09.feedback/2.details",{"title":87,"path":120,"stem":121},"/docs/landing/feedback/admin","0.docs/1.landing/09.feedback/3.admin",{"title":24,"path":123,"stem":124},"/docs/landing/feedback/technical","0.docs/1.landing/09.feedback/4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","/docs/landing/feedback/compare","0.docs/1.landing/09.feedback/5.compare",{"title":130,"path":131,"stem":132},"FAQ","/docs/landing/feedback/faq","0.docs/1.landing/09.feedback/6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","/docs/landing/storage","0.docs/1.landing/10.storage/1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"/docs/landing/storage/details","0.docs/1.landing/10.storage/2.details",{"title":87,"path":144,"stem":145},"/docs/landing/storage/admin","0.docs/1.landing/10.storage/3.admin",{"title":24,"path":147,"stem":148},"/docs/landing/storage/technical","0.docs/1.landing/10.storage/4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","/docs/landing/offline-first","0.docs/1.landing/11.offline-first/1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","/docs/landing/yjs-sync","0.docs/1.landing/12.yjs-sync/1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"/docs/landing/yjs-sync/details","0.docs/1.landing/12.yjs-sync/2.details",{"title":87,"path":167,"stem":168},"/docs/landing/yjs-sync/admin","0.docs/1.landing/12.yjs-sync/3.admin",{"title":24,"path":170,"stem":171},"/docs/landing/yjs-sync/technical","0.docs/1.landing/12.yjs-sync/4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","/docs/landing/newsletter","0.docs/1.landing/13.newsletter/index",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,298],{"title":5,"path":182,"stem":183},"/docs/nuxt-auto","0.docs/3.nuxt-auto/index",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","/docs/nuxt-auto/getting-started","0.docs/3.nuxt-auto/1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","/docs/nuxt-auto/getting-started/introduction","0.docs/3.nuxt-auto/1.getting-started/1.introduction",{"title":194,"path":195,"stem":196},"Installation","/docs/nuxt-auto/getting-started/installation","0.docs/3.nuxt-auto/1.getting-started/2.installation",{"title":198,"path":199,"stem":200},"Quick Start","/docs/nuxt-auto/getting-started/quick-start","0.docs/3.nuxt-auto/1.getting-started/3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","/docs/nuxt-auto/auto-api","0.docs/3.nuxt-auto/2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294],{"title":185,"path":208,"stem":209},"/docs/nuxt-auto/auto-api/getting-started","0.docs/3.nuxt-auto/2.auto-api/1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","/docs/nuxt-auto/auto-api/aggregations","0.docs/3.nuxt-auto/2.auto-api/10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","/docs/nuxt-auto/auto-api/lifecycle-hooks","0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","/docs/nuxt-auto/auto-api/m2m-relationships","0.docs/3.nuxt-auto/2.auto-api/12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","/docs/nuxt-auto/auto-api/plugin-system","0.docs/3.nuxt-auto/2.auto-api/13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","/docs/nuxt-auto/auto-api/database-adapters","0.docs/3.nuxt-auto/2.auto-api/14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","/docs/nuxt-auto/auto-api/custom-endpoints","0.docs/3.nuxt-auto/2.auto-api/15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","/docs/nuxt-auto/auto-api/multi-tenancy","0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy",{"title":239,"path":240,"stem":241},"Validation","/docs/nuxt-auto/auto-api/validation","0.docs/3.nuxt-auto/2.auto-api/2.validation",{"title":243,"path":244,"stem":245},"Rate Limiting","/docs/nuxt-auto/auto-api/rate-limiting","0.docs/3.nuxt-auto/2.auto-api/20.rate-limiting",{"title":247,"path":248,"stem":249},"Request Metadata Plugin","/docs/nuxt-auto/auto-api/request-metadata","0.docs/3.nuxt-auto/2.auto-api/21.request-metadata",{"title":251,"path":252,"stem":253},"Plugin Catalog","/docs/nuxt-auto/auto-api/plugin-catalog","0.docs/3.nuxt-auto/2.auto-api/22.plugin-catalog",{"title":255,"path":256,"stem":257},"Handler Overrides","/docs/nuxt-auto/auto-api/handler-overrides","0.docs/3.nuxt-auto/2.auto-api/3.handler-overrides",{"title":259,"path":260,"stem":261},"Cloudflare D1","/docs/nuxt-auto/auto-api/cloudflare-d1","0.docs/3.nuxt-auto/2.auto-api/30.cloudflare-d1",{"title":263,"path":264,"stem":265},"SQLite to D1 Migration","/docs/nuxt-auto/auto-api/migration-sqlite-d1","0.docs/3.nuxt-auto/2.auto-api/31.migration-sqlite-d1",{"title":267,"path":268,"stem":269},"Frontend Composables","/docs/nuxt-auto/auto-api/frontend-composables","0.docs/3.nuxt-auto/2.auto-api/32.frontend-composables",{"title":271,"path":272,"stem":273},"Testing","/docs/nuxt-auto/auto-api/testing","0.docs/3.nuxt-auto/2.auto-api/33.testing",{"title":275,"path":276,"stem":277},"Pagination","/docs/nuxt-auto/auto-api/pagination","0.docs/3.nuxt-auto/2.auto-api/4.pagination",{"title":279,"path":280,"stem":281},"Soft Deletes","/docs/nuxt-auto/auto-api/soft-deletes","0.docs/3.nuxt-auto/2.auto-api/5.soft-deletes",{"title":283,"path":284,"stem":285},"Authentication & Authorization","/docs/nuxt-auto/auto-api/authentication-authorization","0.docs/3.nuxt-auto/2.auto-api/6.authentication-authorization",{"title":287,"path":288,"stem":289},"Better-Auth Integration","/docs/nuxt-auto/auto-api/better-auth","0.docs/3.nuxt-auto/2.auto-api/7.better-auth",{"title":291,"path":292,"stem":293},"Nested Relations","/docs/nuxt-auto/auto-api/nested-relationships","0.docs/3.nuxt-auto/2.auto-api/8.nested-relationships",{"title":295,"path":296,"stem":297},"Bulk Operations","/docs/nuxt-auto/auto-api/bulk-operations","0.docs/3.nuxt-auto/2.auto-api/9.bulk-operations",{"title":299,"path":300,"stem":301,"children":302,"page":201},"Auto Admin","/docs/nuxt-auto/auto-admin","0.docs/3.nuxt-auto/3.auto-admin",[303,306,310,314,318,322,326,330,334],{"title":185,"path":304,"stem":305},"/docs/nuxt-auto/auto-admin/getting-started","0.docs/3.nuxt-auto/3.auto-admin/1.getting-started",{"title":307,"path":308,"stem":309},"Configuration & Theming","/docs/nuxt-auto/auto-admin/configuration-theming","0.docs/3.nuxt-auto/3.auto-admin/2.configuration-theming",{"title":311,"path":312,"stem":313},"Resource Configuration","/docs/nuxt-auto/auto-admin/resource-configuration","0.docs/3.nuxt-auto/3.auto-admin/3.resource-configuration",{"title":315,"path":316,"stem":317},"Form Fields & Widgets","/docs/nuxt-auto/auto-admin/form-fields-widgets","0.docs/3.nuxt-auto/3.auto-admin/4.form-fields-widgets",{"title":319,"path":320,"stem":321},"Permissions","/docs/nuxt-auto/auto-admin/permissions","0.docs/3.nuxt-auto/3.auto-admin/5.permissions",{"title":323,"path":324,"stem":325},"Custom Pages","/docs/nuxt-auto/auto-admin/custom-pages","0.docs/3.nuxt-auto/3.auto-admin/6.custom-pages",{"title":327,"path":328,"stem":329},"M2M Relationships","/docs/nuxt-auto/auto-admin/m2m-relationships","0.docs/3.nuxt-auto/3.auto-admin/7.m2m-relationships",{"title":331,"path":332,"stem":333},"Custom Actions","/docs/nuxt-auto/auto-admin/custom-actions","0.docs/3.nuxt-auto/3.auto-admin/8.custom-actions",{"title":335,"path":336,"stem":337},"Composables","/docs/nuxt-auto/auto-admin/composables","0.docs/3.nuxt-auto/3.auto-admin/9.composables",[339,342,355,382,400,415,425],{"title":5,"path":340,"stem":341},"/docs/nuxt-protokit","0.docs/4.nuxt-protokit/index",{"title":185,"path":343,"stem":344,"children":345,"icon":354},"/docs/nuxt-protokit/getting-started","0.docs/4.nuxt-protokit/1.getting-started/1.index",[346,347,351],{"title":190,"path":343,"stem":344},{"title":348,"path":349,"stem":350},"Core Concepts","/docs/nuxt-protokit/getting-started/concepts","0.docs/4.nuxt-protokit/1.getting-started/2.concepts",{"title":198,"path":352,"stem":353},"/docs/nuxt-protokit/getting-started/quick-start","0.docs/4.nuxt-protokit/1.getting-started/3.quick-start","i-lucide-rocket",{"title":356,"path":357,"stem":358,"children":359,"icon":381},"Schemas","/docs/nuxt-protokit/schemas","0.docs/4.nuxt-protokit/2.schemas/1.index",[360,361,365,369,373,377],{"title":5,"path":357,"stem":358},{"title":362,"path":363,"stem":364},"Field Types","/docs/nuxt-protokit/schemas/fields","0.docs/4.nuxt-protokit/2.schemas/2.fields",{"title":366,"path":367,"stem":368},"Collections","/docs/nuxt-protokit/schemas/collections","0.docs/4.nuxt-protokit/2.schemas/3.collections",{"title":370,"path":371,"stem":372},"Derived & Computed","/docs/nuxt-protokit/schemas/derived-computed","0.docs/4.nuxt-protokit/2.schemas/4.derived-computed",{"title":374,"path":375,"stem":376},"Connections","/docs/nuxt-protokit/schemas/connections","0.docs/4.nuxt-protokit/2.schemas/5.connections",{"title":378,"path":379,"stem":380},"Visualizations & Layouts","/docs/nuxt-protokit/schemas/visualizations","0.docs/4.nuxt-protokit/2.schemas/6.visualizations","i-lucide-file-code",{"title":335,"path":383,"stem":384,"children":385,"icon":399},"/docs/nuxt-protokit/composables","0.docs/4.nuxt-protokit/3.composables/1.index",[386,387,391,395],{"title":5,"path":383,"stem":384},{"title":388,"path":389,"stem":390},"usePrototype","/docs/nuxt-protokit/composables/use-prototype","0.docs/4.nuxt-protokit/3.composables/2.use-prototype",{"title":392,"path":393,"stem":394},"useProtoDoc","/docs/nuxt-protokit/composables/use-proto-doc","0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc",{"title":396,"path":397,"stem":398},"useProtoCollection","/docs/nuxt-protokit/composables/use-proto-collection","0.docs/4.nuxt-protokit/3.composables/4.use-proto-collection","i-lucide-layers",{"title":401,"path":402,"stem":403,"children":404,"icon":414},"Components","/docs/nuxt-protokit/components","0.docs/4.nuxt-protokit/4.components/1.index",[405,406,410],{"title":5,"path":402,"stem":403},{"title":407,"path":408,"stem":409},"ProtoTool","/docs/nuxt-protokit/components/proto-tool","0.docs/4.nuxt-protokit/4.components/2.proto-tool",{"title":411,"path":412,"stem":413},"ProtoCrudModal","/docs/nuxt-protokit/components/proto-crud-modal","0.docs/4.nuxt-protokit/4.components/3.proto-crud-modal","i-lucide-puzzle",{"title":151,"path":416,"stem":417,"children":418,"icon":424},"/docs/nuxt-protokit/offline-first","0.docs/4.nuxt-protokit/5.offline-first/1.index",[419,420],{"title":151,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Corruption Recovery","/docs/nuxt-protokit/offline-first/corruption-recovery","0.docs/4.nuxt-protokit/5.offline-first/2.corruption-recovery","i-lucide-wifi-off",{"title":426,"icon":427,"path":428,"stem":429,"children":430},"Advanced","i-lucide-graduation-cap","/docs/nuxt-protokit/advanced","0.docs/4.nuxt-protokit/6.advanced/1.index",[431,432,436,440],{"title":5,"path":428,"stem":429},{"title":433,"path":434,"stem":435},"Multi-Tool Apps","/docs/nuxt-protokit/advanced/building-a-toolkit","0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit",{"title":437,"path":438,"stem":439},"Schema Patterns","/docs/nuxt-protokit/advanced/custom-schema-patterns","0.docs/4.nuxt-protokit/6.advanced/2.custom-schema-patterns",{"title":441,"path":442,"stem":443},"Custom Fields & Viz","/docs/nuxt-protokit/advanced/extensibility","0.docs/4.nuxt-protokit/6.advanced/3.extensibility",{"id":445,"title":446,"authors":447,"badge":452,"body":454,"date":2159,"description":2160,"extension":2161,"image":2162,"meta":2164,"navigation":919,"ogImage":2165,"path":2166,"published":919,"seo":2167,"stem":2168,"tags":2169,"__hash__":2174},"posts/3.blog/2.fix-nuxt-content-404.md","Nuxt Content 404 issues? One config can fix it",[448],{"name":449,"avatar":450},"Benjamin",{"src":451},"profile/benjamin.webp",{"label":453},"Guide",{"type":455,"value":456,"toc":2146},"minimark",[457,469,474,477,480,483,486,490,493,496,504,514,517,521,528,535,592,598,601,605,611,702,713,716,720,723,785,792,795,809,812,815,818,821,825,828,1163,1166,1171,1174,1287,1290,1292,1296,1299,2079,2083,2090,2093,2101,2104,2107,2113,2116,2120,2123,2126,2129,2131,2142],[458,459,462,466],"callout",{"color":460,"icon":461},"neutral","i-lucide-info",[463,464,465],"p",{},"This post is about prodction issue cause by prerendering.",[463,467,468],{},"If you are here because you get many 404 with the development server, then that can be fixed by building after adding new content files.",[470,471,473],"h2",{"id":472},"intro","Intro",[463,475,476],{},"Enabled prerendering today. I wanted to optimize the performance and the D1 db reads a bit.",[463,478,479],{},"Pushed to production and I was really lucky that someone reported a 404 error on my shared blog post on discord.",[463,481,482],{},"A quick review revealed the issue exist, so looking back my recent changes, the prerendering was a possible issue, so I wuickly reverted that change to fix the issue on prod.",[463,484,485],{},"But I was curious. Went to the blog index - worked fine. Clicked through to a post - worked fine. Everything seemed ok.\nSo what broke for that direct link?",[470,487,489],{"id":488},"the-problem","The Problem",[463,491,492],{},"After poking around, I found it. The file exists. The route is there. But direct URLs 404.",[463,494,495],{},"Blog index to post? Works.\nDirect link or refresh? 404.",[463,497,498,499,503],{},"Took way too long to spot it. That extra ",[500,501,502],"code",{},"/"," at the end, just like an annoying comma in large codebase:",[463,505,506,507,510,511],{},"Navigate from index: ",[500,508,509],{},"/blog/my-post","\nHit the URL directly: ",[500,512,513],{},"/blog/my-post/",[463,515,516],{},"One character.",[470,518,520],{"id":519},"why-this-breaks","Why This Breaks",[463,522,523,524,527],{},"Prerendering creates ",[500,525,526],{},"/blog/my-post/index.html"," by default (subfolder with index file). When you hit that URL directly, browsers add a trailing slash. Standard browser behavior.",[463,529,530,531,534],{},"Your Nuxt Content query uses ",[500,532,533],{},"route.path",":",[536,537,542],"pre",{"className":538,"code":539,"language":540,"meta":541,"style":541},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","queryCollection('posts').path(route.path).first()\n","typescript","",[500,543,544],{"__ignoreMap":541},[545,546,549,553,557,561,565,567,570,573,576,579,581,584,586,589],"span",{"class":547,"line":548},"line",1,[545,550,552],{"class":551},"s2Zo4","queryCollection",[545,554,556],{"class":555},"sTEyZ","(",[545,558,560],{"class":559},"sMK4o","'",[545,562,564],{"class":563},"sfazB","posts",[545,566,560],{"class":559},[545,568,569],{"class":555},")",[545,571,572],{"class":559},".",[545,574,575],{"class":551},"path",[545,577,578],{"class":555},"(route",[545,580,572],{"class":559},[545,582,583],{"class":555},"path)",[545,585,572],{"class":559},[545,587,588],{"class":551},"first",[545,590,591],{"class":555},"()\n",[463,593,594,595,597],{},"Route path is now ",[500,596,513],{}," (with slash). Content query looks for exact match. Finds nothing. Returns null. You get 404.",[463,599,600],{},"The dev experience fools you - clicking links works because client-side routing doesn't add the slash. Everything seems fine until someone refreshes or shares a direct link.",[470,602,604],{"id":603},"the-fix","The Fix",[463,606,607,608,534],{},"One line in ",[500,609,610],{},"nuxt.config.ts",[536,612,616],{"className":538,"code":613,"highlights":614,"language":540,"meta":541,"style":541},"nitro: {\n  prerender: {\n    autoSubfolderIndex: false,\n    routes: ['/blog'],\n    crawlLinks: true\n  }\n}\n",[615],3,[500,617,618,629,639,655,679,690,696],{"__ignoreMap":541},[545,619,620,624,626],{"class":547,"line":548},[545,621,623],{"class":622},"sBMFI","nitro",[545,625,534],{"class":559},[545,627,628],{"class":559}," {\n",[545,630,632,635,637],{"class":547,"line":631},2,[545,633,634],{"class":622},"  prerender",[545,636,534],{"class":559},[545,638,628],{"class":559},[545,640,643,646,648,652],{"class":641,"line":615},[547,642],"highlight",[545,644,645],{"class":622},"    autoSubfolderIndex",[545,647,534],{"class":559},[545,649,651],{"class":650},"sfNiH"," false",[545,653,654],{"class":559},",\n",[545,656,658,661,663,667,669,672,674,677],{"class":547,"line":657},4,[545,659,660],{"class":622},"    routes",[545,662,534],{"class":559},[545,664,666],{"class":665},"swJcz"," [",[545,668,560],{"class":559},[545,670,671],{"class":563},"/blog",[545,673,560],{"class":559},[545,675,676],{"class":665},"]",[545,678,654],{"class":559},[545,680,682,685,687],{"class":547,"line":681},5,[545,683,684],{"class":622},"    crawlLinks",[545,686,534],{"class":559},[545,688,689],{"class":650}," true\n",[545,691,693],{"class":547,"line":692},6,[545,694,695],{"class":559},"  }\n",[545,697,699],{"class":547,"line":698},7,[545,700,701],{"class":559},"}\n",[463,703,704,705,708,709,712],{},"That's it. This tells Nuxt to create ",[500,706,707],{},"/blog/post.html"," instead of ",[500,710,711],{},"/blog/post/index.html",". No subfolder, no index file, no trailing slash.",[463,714,715],{},"Refresh now? Works.",[470,717,719],{"id":718},"why-not-just-handle-it-in-code","Why Not Just Handle It in Code?",[463,721,722],{},"You could normalize the path in your component:",[536,724,726],{"className":538,"code":725,"language":540,"meta":541,"style":541},"const normalizedPath = computed(() => route.path.replace(/\\/$/, ''))\n",[500,727,728],{"__ignoreMap":541},[545,729,730,734,737,740,743,745,748,751,754,756,758,760,763,765,767,770,774,776,779,782],{"class":547,"line":548},[545,731,733],{"class":732},"spNyl","const",[545,735,736],{"class":555}," normalizedPath ",[545,738,739],{"class":559},"=",[545,741,742],{"class":551}," computed",[545,744,556],{"class":555},[545,746,747],{"class":559},"()",[545,749,750],{"class":732}," =>",[545,752,753],{"class":555}," route",[545,755,572],{"class":559},[545,757,575],{"class":555},[545,759,572],{"class":559},[545,761,762],{"class":551},"replace",[545,764,556],{"class":555},[545,766,502],{"class":559},[545,768,769],{"class":555},"\\/",[545,771,773],{"class":772},"s7zQu","$",[545,775,502],{"class":559},[545,777,778],{"class":559},",",[545,780,781],{"class":559}," ''",[545,783,784],{"class":555},"))\n",[463,786,787,788,572],{},"This makes both URLs work. But now you have a worse problem: ",[789,790,791],"strong",{},"split analytics",[463,793,794],{},"Umami (or GA, whatever you use) sees these as different pages:",[796,797,798,804],"ul",{},[799,800,801,803],"li",{},[500,802,509],{}," - 45 views",[799,805,806,808],{},[500,807,513],{}," - 23 views",[463,810,811],{},"Which one is the \"real\" number? Neither. You're splitting your traffic data for no reason.",[463,813,814],{},"Same with SEO. Google sees two URLs for the same content. Not ideal.",[463,816,817],{},"The config fix gives you one canonical URL. All traffic counts correctly. SEO stays clean. That's what you want.",[819,820],"hr",{},[470,822,824],{"id":823},"the-workaround-if-you-must","The Workaround (If You Must)",[463,826,827],{},"Actually I fixed like this first, but I was not satisfied with this approach. Here's how to handle it in code:",[536,829,837],{"className":830,"code":831,"highlights":832,"language":836,"meta":541,"style":541},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nconst route = useRoute()\nconst appConfig = useAppConfig()\nconst { locale } = useI18n()\n\n// Normalize path by removing trailing slash\nconst normalizedPath = computed(() => route.path.replace(/\\/$/, ''))\n\nconst { data: post } = await useAsyncData(\n  `blog-post-${normalizedPath.value}-${locale.value}`,\n  async () => {\n    // Use normalized path for querying\n    const path = normalizedPath.value\n    const result = await queryCollection('posts')\n      .path(path)\n      .first()\n\n    return result\n  }\n)\n\u003C/script>\n",[698,833,834,835],13,14,15,"vue",[500,838,839,866,880,894,915,921,927,970,975,1003,1042,1055,1061,1080,1106,1120,1129,1134,1143,1148,1153],{"__ignoreMap":541},[545,840,841,844,847,850,853,855,858,861,863],{"class":547,"line":548},[545,842,843],{"class":559},"\u003C",[545,845,846],{"class":665},"script",[545,848,849],{"class":732}," setup",[545,851,852],{"class":732}," lang",[545,854,739],{"class":559},[545,856,857],{"class":559},"\"",[545,859,860],{"class":563},"ts",[545,862,857],{"class":559},[545,864,865],{"class":559},">\n",[545,867,868,870,873,875,878],{"class":547,"line":631},[545,869,733],{"class":732},[545,871,872],{"class":555}," route ",[545,874,739],{"class":559},[545,876,877],{"class":551}," useRoute",[545,879,591],{"class":555},[545,881,882,884,887,889,892],{"class":547,"line":615},[545,883,733],{"class":732},[545,885,886],{"class":555}," appConfig ",[545,888,739],{"class":559},[545,890,891],{"class":551}," useAppConfig",[545,893,591],{"class":555},[545,895,896,898,901,904,907,910,913],{"class":547,"line":657},[545,897,733],{"class":732},[545,899,900],{"class":559}," {",[545,902,903],{"class":555}," locale ",[545,905,906],{"class":559},"}",[545,908,909],{"class":559}," =",[545,911,912],{"class":551}," useI18n",[545,914,591],{"class":555},[545,916,917],{"class":547,"line":681},[545,918,920],{"emptyLinePlaceholder":919},true,"\n",[545,922,923],{"class":547,"line":692},[545,924,926],{"class":925},"sHwdD","// Normalize path by removing trailing slash\n",[545,928,930,932,934,936,938,940,942,944,946,948,950,952,954,956,958,960,962,964,966,968],{"class":929,"line":698},[547,642],[545,931,733],{"class":732},[545,933,736],{"class":555},[545,935,739],{"class":559},[545,937,742],{"class":551},[545,939,556],{"class":555},[545,941,747],{"class":559},[545,943,750],{"class":732},[545,945,753],{"class":555},[545,947,572],{"class":559},[545,949,575],{"class":555},[545,951,572],{"class":559},[545,953,762],{"class":551},[545,955,556],{"class":555},[545,957,502],{"class":559},[545,959,769],{"class":555},[545,961,773],{"class":772},[545,963,502],{"class":559},[545,965,778],{"class":559},[545,967,781],{"class":559},[545,969,784],{"class":555},[545,971,973],{"class":547,"line":972},8,[545,974,920],{"emptyLinePlaceholder":919},[545,976,978,980,982,985,987,990,992,994,997,1000],{"class":547,"line":977},9,[545,979,733],{"class":732},[545,981,900],{"class":559},[545,983,984],{"class":665}," data",[545,986,534],{"class":559},[545,988,989],{"class":555}," post ",[545,991,906],{"class":559},[545,993,909],{"class":559},[545,995,996],{"class":772}," await",[545,998,999],{"class":551}," useAsyncData",[545,1001,1002],{"class":555},"(\n",[545,1004,1006,1009,1012,1015,1018,1020,1023,1025,1028,1030,1033,1035,1037,1040],{"class":547,"line":1005},10,[545,1007,1008],{"class":559},"  `",[545,1010,1011],{"class":563},"blog-post-",[545,1013,1014],{"class":559},"${",[545,1016,1017],{"class":555},"normalizedPath",[545,1019,572],{"class":559},[545,1021,1022],{"class":555},"value",[545,1024,906],{"class":559},[545,1026,1027],{"class":563},"-",[545,1029,1014],{"class":559},[545,1031,1032],{"class":555},"locale",[545,1034,572],{"class":559},[545,1036,1022],{"class":555},[545,1038,1039],{"class":559},"}`",[545,1041,654],{"class":559},[545,1043,1045,1048,1051,1053],{"class":547,"line":1044},11,[545,1046,1047],{"class":732},"  async",[545,1049,1050],{"class":559}," ()",[545,1052,750],{"class":732},[545,1054,628],{"class":559},[545,1056,1058],{"class":547,"line":1057},12,[545,1059,1060],{"class":925},"    // Use normalized path for querying\n",[545,1062,1064,1067,1070,1072,1075,1077],{"class":1063,"line":833},[547,642],[545,1065,1066],{"class":732},"    const",[545,1068,1069],{"class":555}," path",[545,1071,909],{"class":559},[545,1073,1074],{"class":555}," normalizedPath",[545,1076,572],{"class":559},[545,1078,1079],{"class":555},"value\n",[545,1081,1083,1085,1088,1090,1092,1095,1097,1099,1101,1103],{"class":1082,"line":834},[547,642],[545,1084,1066],{"class":732},[545,1086,1087],{"class":555}," result",[545,1089,909],{"class":559},[545,1091,996],{"class":772},[545,1093,1094],{"class":551}," queryCollection",[545,1096,556],{"class":665},[545,1098,560],{"class":559},[545,1100,564],{"class":563},[545,1102,560],{"class":559},[545,1104,1105],{"class":665},")\n",[545,1107,1109,1112,1114,1116,1118],{"class":1108,"line":835},[547,642],[545,1110,1111],{"class":559},"      .",[545,1113,575],{"class":551},[545,1115,556],{"class":665},[545,1117,575],{"class":555},[545,1119,1105],{"class":665},[545,1121,1123,1125,1127],{"class":547,"line":1122},16,[545,1124,1111],{"class":559},[545,1126,588],{"class":551},[545,1128,591],{"class":665},[545,1130,1132],{"class":547,"line":1131},17,[545,1133,920],{"emptyLinePlaceholder":919},[545,1135,1137,1140],{"class":547,"line":1136},18,[545,1138,1139],{"class":772},"    return",[545,1141,1142],{"class":555}," result\n",[545,1144,1146],{"class":547,"line":1145},19,[545,1147,695],{"class":559},[545,1149,1151],{"class":547,"line":1150},20,[545,1152,1105],{"class":555},[545,1154,1156,1159,1161],{"class":547,"line":1155},21,[545,1157,1158],{"class":559},"\u003C/",[545,1160,846],{"class":665},[545,1162,865],{"class":559},[463,1164,1165],{},"Both URLs work now. But analytics are still split. Not the solution I'd recommend.",[1167,1168,1170],"h3",{"id":1169},"performance-tip","Performance Tip",[463,1172,1173],{},"While you're here, add this to prevent client-side re-queries:",[536,1175,1178],{"className":538,"code":1176,"highlights":1177,"language":540,"meta":541,"style":541},"const { data: post } = await useAsyncData(\n  `blog-post-${normalizedPath.value}`,\n  async () => {\n    // query logic\n  },\n  {\n    getCachedData: (key) => useNuxtApp().payload.data[key]\n  }\n)\n",[698],[500,1179,1180,1202,1220,1230,1235,1240,1245,1279,1283],{"__ignoreMap":541},[545,1181,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200],{"class":547,"line":548},[545,1183,733],{"class":732},[545,1185,900],{"class":559},[545,1187,984],{"class":665},[545,1189,534],{"class":559},[545,1191,989],{"class":555},[545,1193,906],{"class":559},[545,1195,909],{"class":559},[545,1197,996],{"class":772},[545,1199,999],{"class":551},[545,1201,1002],{"class":555},[545,1203,1204,1206,1208,1210,1212,1214,1216,1218],{"class":547,"line":631},[545,1205,1008],{"class":559},[545,1207,1011],{"class":563},[545,1209,1014],{"class":559},[545,1211,1017],{"class":555},[545,1213,572],{"class":559},[545,1215,1022],{"class":555},[545,1217,1039],{"class":559},[545,1219,654],{"class":559},[545,1221,1222,1224,1226,1228],{"class":547,"line":615},[545,1223,1047],{"class":732},[545,1225,1050],{"class":559},[545,1227,750],{"class":732},[545,1229,628],{"class":559},[545,1231,1232],{"class":547,"line":657},[545,1233,1234],{"class":925},"    // query logic\n",[545,1236,1237],{"class":547,"line":681},[545,1238,1239],{"class":559},"  },\n",[545,1241,1242],{"class":547,"line":692},[545,1243,1244],{"class":559},"  {\n",[545,1246,1248,1251,1253,1256,1260,1262,1264,1267,1269,1271,1274,1276],{"class":1247,"line":698},[547,642],[545,1249,1250],{"class":551},"    getCachedData",[545,1252,534],{"class":559},[545,1254,1255],{"class":559}," (",[545,1257,1259],{"class":1258},"sHdIc","key",[545,1261,569],{"class":559},[545,1263,750],{"class":732},[545,1265,1266],{"class":551}," useNuxtApp",[545,1268,747],{"class":555},[545,1270,572],{"class":559},[545,1272,1273],{"class":555},"payload",[545,1275,572],{"class":559},[545,1277,1278],{"class":555},"data[key]\n",[545,1280,1281],{"class":547,"line":972},[545,1282,695],{"class":559},[545,1284,1285],{"class":547,"line":977},[545,1286,1105],{"class":555},[463,1288,1289],{},"This tells Nuxt to use the prerendered data instead of querying again on the client. Small optimization, but it adds up.",[819,1291],{},[470,1293,1295],{"id":1294},"complete-example","Complete Example",[463,1297,1298],{},"Here's a working blog setup with the config fix:",[1300,1301,1303,1644,1947],"code-tree",{"default-value":1302},"pages/blog/[slug].vue",[536,1304,1306],{"className":830,"code":1305,"filename":1302,"language":836,"meta":541,"style":541},"\u003Cscript setup lang=\"ts\">\nconst route = useRoute()\n\nconst { data: post } = await useAsyncData(\n  `blog-post-${route.path}`,\n  async () => {\n    return await queryCollection('posts')\n      .path(route.path)\n      .first()\n  },\n  {\n    getCachedData: (key) => useNuxtApp().payload.data[key]\n  }\n)\n\nif (!post.value) {\n  throw createError({ statusCode: 404, statusMessage: 'Post not found' })\n}\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>{{ post.title }}\u003C/h1>\n    \u003CContentRenderer :value=\"post\" />\n  \u003C/div>\n\u003C/template>\n",[500,1307,1308,1328,1340,1344,1366,1385,1395,1413,1429,1437,1441,1445,1471,1475,1479,1483,1504,1546,1550,1558,1562,1571,1582,1603,1625,1635],{"__ignoreMap":541},[545,1309,1310,1312,1314,1316,1318,1320,1322,1324,1326],{"class":547,"line":548},[545,1311,843],{"class":559},[545,1313,846],{"class":665},[545,1315,849],{"class":732},[545,1317,852],{"class":732},[545,1319,739],{"class":559},[545,1321,857],{"class":559},[545,1323,860],{"class":563},[545,1325,857],{"class":559},[545,1327,865],{"class":559},[545,1329,1330,1332,1334,1336,1338],{"class":547,"line":631},[545,1331,733],{"class":732},[545,1333,872],{"class":555},[545,1335,739],{"class":559},[545,1337,877],{"class":551},[545,1339,591],{"class":555},[545,1341,1342],{"class":547,"line":615},[545,1343,920],{"emptyLinePlaceholder":919},[545,1345,1346,1348,1350,1352,1354,1356,1358,1360,1362,1364],{"class":547,"line":657},[545,1347,733],{"class":732},[545,1349,900],{"class":559},[545,1351,984],{"class":665},[545,1353,534],{"class":559},[545,1355,989],{"class":555},[545,1357,906],{"class":559},[545,1359,909],{"class":559},[545,1361,996],{"class":772},[545,1363,999],{"class":551},[545,1365,1002],{"class":555},[545,1367,1368,1370,1372,1374,1377,1379,1381,1383],{"class":547,"line":681},[545,1369,1008],{"class":559},[545,1371,1011],{"class":563},[545,1373,1014],{"class":559},[545,1375,1376],{"class":555},"route",[545,1378,572],{"class":559},[545,1380,575],{"class":555},[545,1382,1039],{"class":559},[545,1384,654],{"class":559},[545,1386,1387,1389,1391,1393],{"class":547,"line":692},[545,1388,1047],{"class":732},[545,1390,1050],{"class":559},[545,1392,750],{"class":732},[545,1394,628],{"class":559},[545,1396,1397,1399,1401,1403,1405,1407,1409,1411],{"class":547,"line":698},[545,1398,1139],{"class":772},[545,1400,996],{"class":772},[545,1402,1094],{"class":551},[545,1404,556],{"class":665},[545,1406,560],{"class":559},[545,1408,564],{"class":563},[545,1410,560],{"class":559},[545,1412,1105],{"class":665},[545,1414,1415,1417,1419,1421,1423,1425,1427],{"class":547,"line":972},[545,1416,1111],{"class":559},[545,1418,575],{"class":551},[545,1420,556],{"class":665},[545,1422,1376],{"class":555},[545,1424,572],{"class":559},[545,1426,575],{"class":555},[545,1428,1105],{"class":665},[545,1430,1431,1433,1435],{"class":547,"line":977},[545,1432,1111],{"class":559},[545,1434,588],{"class":551},[545,1436,591],{"class":665},[545,1438,1439],{"class":547,"line":1005},[545,1440,1239],{"class":559},[545,1442,1443],{"class":547,"line":1044},[545,1444,1244],{"class":559},[545,1446,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469],{"class":547,"line":1057},[545,1448,1250],{"class":551},[545,1450,534],{"class":559},[545,1452,1255],{"class":559},[545,1454,1259],{"class":1258},[545,1456,569],{"class":559},[545,1458,750],{"class":732},[545,1460,1266],{"class":551},[545,1462,747],{"class":555},[545,1464,572],{"class":559},[545,1466,1273],{"class":555},[545,1468,572],{"class":559},[545,1470,1278],{"class":555},[545,1472,1473],{"class":547,"line":833},[545,1474,695],{"class":559},[545,1476,1477],{"class":547,"line":834},[545,1478,1105],{"class":555},[545,1480,1481],{"class":547,"line":835},[545,1482,920],{"emptyLinePlaceholder":919},[545,1484,1485,1488,1490,1493,1496,1498,1501],{"class":547,"line":1122},[545,1486,1487],{"class":772},"if",[545,1489,1255],{"class":555},[545,1491,1492],{"class":559},"!",[545,1494,1495],{"class":555},"post",[545,1497,572],{"class":559},[545,1499,1500],{"class":555},"value) ",[545,1502,1503],{"class":559},"{\n",[545,1505,1506,1509,1512,1514,1517,1520,1522,1526,1528,1531,1533,1536,1539,1541,1544],{"class":547,"line":1131},[545,1507,1508],{"class":772},"  throw",[545,1510,1511],{"class":551}," createError",[545,1513,556],{"class":665},[545,1515,1516],{"class":559},"{",[545,1518,1519],{"class":665}," statusCode",[545,1521,534],{"class":559},[545,1523,1525],{"class":1524},"sbssI"," 404",[545,1527,778],{"class":559},[545,1529,1530],{"class":665}," statusMessage",[545,1532,534],{"class":559},[545,1534,1535],{"class":559}," '",[545,1537,1538],{"class":563},"Post not found",[545,1540,560],{"class":559},[545,1542,1543],{"class":559}," }",[545,1545,1105],{"class":665},[545,1547,1548],{"class":547,"line":1136},[545,1549,701],{"class":559},[545,1551,1552,1554,1556],{"class":547,"line":1145},[545,1553,1158],{"class":559},[545,1555,846],{"class":665},[545,1557,865],{"class":559},[545,1559,1560],{"class":547,"line":1150},[545,1561,920],{"emptyLinePlaceholder":919},[545,1563,1564,1566,1569],{"class":547,"line":1155},[545,1565,843],{"class":559},[545,1567,1568],{"class":665},"template",[545,1570,865],{"class":559},[545,1572,1574,1577,1580],{"class":547,"line":1573},22,[545,1575,1576],{"class":559},"  \u003C",[545,1578,1579],{"class":665},"div",[545,1581,865],{"class":559},[545,1583,1585,1588,1591,1594,1597,1599,1601],{"class":547,"line":1584},23,[545,1586,1587],{"class":559},"    \u003C",[545,1589,1590],{"class":665},"h1",[545,1592,1593],{"class":559},">",[545,1595,1596],{"class":555},"{{ post.title }}",[545,1598,1158],{"class":559},[545,1600,1590],{"class":665},[545,1602,865],{"class":559},[545,1604,1606,1608,1611,1614,1616,1618,1620,1622],{"class":547,"line":1605},24,[545,1607,1587],{"class":559},[545,1609,1610],{"class":665},"ContentRenderer",[545,1612,1613],{"class":732}," :value",[545,1615,739],{"class":559},[545,1617,857],{"class":559},[545,1619,1495],{"class":563},[545,1621,857],{"class":559},[545,1623,1624],{"class":559}," />\n",[545,1626,1628,1631,1633],{"class":547,"line":1627},25,[545,1629,1630],{"class":559},"  \u003C/",[545,1632,1579],{"class":665},[545,1634,865],{"class":559},[545,1636,1638,1640,1642],{"class":547,"line":1637},26,[545,1639,1158],{"class":559},[545,1641,1568],{"class":665},[545,1643,865],{"class":559},[536,1645,1648],{"className":538,"code":1646,"filename":1647,"language":540,"meta":541,"style":541},"import { defineContentConfig, defineCollection, z } from '@nuxt/content'\n\nconst postSchema = z.object({\n  title: z.string(),\n  description: z.string(),\n  date: z.date(),\n  image: z.object({\n    src: z.string()\n  }),\n  published: z.boolean().default(true)\n})\n\nexport const collections = {\n  // English posts (default locale)\n  posts: defineCollection({\n    type: 'page',\n    source: 'blog/**/*.md',\n    schema: postSchema\n  })\n}\n\nexport default defineContentConfig({ collections })\n","content.config.ts",[500,1649,1650,1683,1687,1707,1725,1742,1760,1777,1792,1801,1829,1835,1839,1854,1859,1872,1888,1904,1914,1920,1924,1928],{"__ignoreMap":541},[545,1651,1652,1655,1657,1660,1662,1665,1667,1670,1672,1675,1677,1680],{"class":547,"line":548},[545,1653,1654],{"class":772},"import",[545,1656,900],{"class":559},[545,1658,1659],{"class":555}," defineContentConfig",[545,1661,778],{"class":559},[545,1663,1664],{"class":555}," defineCollection",[545,1666,778],{"class":559},[545,1668,1669],{"class":555}," z",[545,1671,1543],{"class":559},[545,1673,1674],{"class":772}," from",[545,1676,1535],{"class":559},[545,1678,1679],{"class":563},"@nuxt/content",[545,1681,1682],{"class":559},"'\n",[545,1684,1685],{"class":547,"line":631},[545,1686,920],{"emptyLinePlaceholder":919},[545,1688,1689,1691,1694,1696,1698,1700,1703,1705],{"class":547,"line":615},[545,1690,733],{"class":732},[545,1692,1693],{"class":555}," postSchema ",[545,1695,739],{"class":559},[545,1697,1669],{"class":555},[545,1699,572],{"class":559},[545,1701,1702],{"class":551},"object",[545,1704,556],{"class":555},[545,1706,1503],{"class":559},[545,1708,1709,1712,1714,1716,1718,1721,1723],{"class":547,"line":657},[545,1710,1711],{"class":665},"  title",[545,1713,534],{"class":559},[545,1715,1669],{"class":555},[545,1717,572],{"class":559},[545,1719,1720],{"class":551},"string",[545,1722,747],{"class":555},[545,1724,654],{"class":559},[545,1726,1727,1730,1732,1734,1736,1738,1740],{"class":547,"line":681},[545,1728,1729],{"class":665},"  description",[545,1731,534],{"class":559},[545,1733,1669],{"class":555},[545,1735,572],{"class":559},[545,1737,1720],{"class":551},[545,1739,747],{"class":555},[545,1741,654],{"class":559},[545,1743,1744,1747,1749,1751,1753,1756,1758],{"class":547,"line":692},[545,1745,1746],{"class":665},"  date",[545,1748,534],{"class":559},[545,1750,1669],{"class":555},[545,1752,572],{"class":559},[545,1754,1755],{"class":551},"date",[545,1757,747],{"class":555},[545,1759,654],{"class":559},[545,1761,1762,1765,1767,1769,1771,1773,1775],{"class":547,"line":698},[545,1763,1764],{"class":665},"  image",[545,1766,534],{"class":559},[545,1768,1669],{"class":555},[545,1770,572],{"class":559},[545,1772,1702],{"class":551},[545,1774,556],{"class":555},[545,1776,1503],{"class":559},[545,1778,1779,1782,1784,1786,1788,1790],{"class":547,"line":972},[545,1780,1781],{"class":665},"    src",[545,1783,534],{"class":559},[545,1785,1669],{"class":555},[545,1787,572],{"class":559},[545,1789,1720],{"class":551},[545,1791,591],{"class":555},[545,1793,1794,1797,1799],{"class":547,"line":977},[545,1795,1796],{"class":559},"  }",[545,1798,569],{"class":555},[545,1800,654],{"class":559},[545,1802,1803,1806,1808,1810,1812,1815,1817,1819,1822,1824,1827],{"class":547,"line":1005},[545,1804,1805],{"class":665},"  published",[545,1807,534],{"class":559},[545,1809,1669],{"class":555},[545,1811,572],{"class":559},[545,1813,1814],{"class":551},"boolean",[545,1816,747],{"class":555},[545,1818,572],{"class":559},[545,1820,1821],{"class":551},"default",[545,1823,556],{"class":555},[545,1825,1826],{"class":650},"true",[545,1828,1105],{"class":555},[545,1830,1831,1833],{"class":547,"line":1044},[545,1832,906],{"class":559},[545,1834,1105],{"class":555},[545,1836,1837],{"class":547,"line":1057},[545,1838,920],{"emptyLinePlaceholder":919},[545,1840,1841,1844,1847,1850,1852],{"class":547,"line":833},[545,1842,1843],{"class":772},"export",[545,1845,1846],{"class":732}," const",[545,1848,1849],{"class":555}," collections ",[545,1851,739],{"class":559},[545,1853,628],{"class":559},[545,1855,1856],{"class":547,"line":834},[545,1857,1858],{"class":925},"  // English posts (default locale)\n",[545,1860,1861,1864,1866,1868,1870],{"class":547,"line":835},[545,1862,1863],{"class":665},"  posts",[545,1865,534],{"class":559},[545,1867,1664],{"class":551},[545,1869,556],{"class":555},[545,1871,1503],{"class":559},[545,1873,1874,1877,1879,1881,1884,1886],{"class":547,"line":1122},[545,1875,1876],{"class":665},"    type",[545,1878,534],{"class":559},[545,1880,1535],{"class":559},[545,1882,1883],{"class":563},"page",[545,1885,560],{"class":559},[545,1887,654],{"class":559},[545,1889,1890,1893,1895,1897,1900,1902],{"class":547,"line":1131},[545,1891,1892],{"class":665},"    source",[545,1894,534],{"class":559},[545,1896,1535],{"class":559},[545,1898,1899],{"class":563},"blog/**/*.md",[545,1901,560],{"class":559},[545,1903,654],{"class":559},[545,1905,1906,1909,1911],{"class":547,"line":1136},[545,1907,1908],{"class":665},"    schema",[545,1910,534],{"class":559},[545,1912,1913],{"class":555}," postSchema\n",[545,1915,1916,1918],{"class":547,"line":1145},[545,1917,1796],{"class":559},[545,1919,1105],{"class":555},[545,1921,1922],{"class":547,"line":1150},[545,1923,701],{"class":559},[545,1925,1926],{"class":547,"line":1155},[545,1927,920],{"emptyLinePlaceholder":919},[545,1929,1930,1932,1935,1937,1939,1941,1943,1945],{"class":547,"line":1573},[545,1931,1843],{"class":772},[545,1933,1934],{"class":772}," default",[545,1936,1659],{"class":551},[545,1938,556],{"class":555},[545,1940,1516],{"class":559},[545,1942,1849],{"class":555},[545,1944,906],{"class":559},[545,1946,1105],{"class":555},[536,1948,1950],{"className":538,"code":1949,"filename":610,"language":540,"meta":541,"style":541},"export default defineNuxtConfig({\n  modules: ['@nuxt/content'],\n\n  nitro: {\n    preset: 'cloudflare_module',\n    prerender: {\n      autoSubfolderIndex: false, // The fix\n      routes: ['/blog'],\n      crawlLinks: true\n    }\n  }\n})\n",[500,1951,1952,1965,1984,1988,1997,2013,2022,2036,2055,2064,2069,2073],{"__ignoreMap":541},[545,1953,1954,1956,1958,1961,1963],{"class":547,"line":548},[545,1955,1843],{"class":772},[545,1957,1934],{"class":772},[545,1959,1960],{"class":551}," defineNuxtConfig",[545,1962,556],{"class":555},[545,1964,1503],{"class":559},[545,1966,1967,1970,1972,1974,1976,1978,1980,1982],{"class":547,"line":631},[545,1968,1969],{"class":665},"  modules",[545,1971,534],{"class":559},[545,1973,666],{"class":555},[545,1975,560],{"class":559},[545,1977,1679],{"class":563},[545,1979,560],{"class":559},[545,1981,676],{"class":555},[545,1983,654],{"class":559},[545,1985,1986],{"class":547,"line":615},[545,1987,920],{"emptyLinePlaceholder":919},[545,1989,1990,1993,1995],{"class":547,"line":657},[545,1991,1992],{"class":665},"  nitro",[545,1994,534],{"class":559},[545,1996,628],{"class":559},[545,1998,1999,2002,2004,2006,2009,2011],{"class":547,"line":681},[545,2000,2001],{"class":665},"    preset",[545,2003,534],{"class":559},[545,2005,1535],{"class":559},[545,2007,2008],{"class":563},"cloudflare_module",[545,2010,560],{"class":559},[545,2012,654],{"class":559},[545,2014,2015,2018,2020],{"class":547,"line":692},[545,2016,2017],{"class":665},"    prerender",[545,2019,534],{"class":559},[545,2021,628],{"class":559},[545,2023,2024,2027,2029,2031,2033],{"class":547,"line":698},[545,2025,2026],{"class":665},"      autoSubfolderIndex",[545,2028,534],{"class":559},[545,2030,651],{"class":650},[545,2032,778],{"class":559},[545,2034,2035],{"class":925}," // The fix\n",[545,2037,2038,2041,2043,2045,2047,2049,2051,2053],{"class":547,"line":972},[545,2039,2040],{"class":665},"      routes",[545,2042,534],{"class":559},[545,2044,666],{"class":555},[545,2046,560],{"class":559},[545,2048,671],{"class":563},[545,2050,560],{"class":559},[545,2052,676],{"class":555},[545,2054,654],{"class":559},[545,2056,2057,2060,2062],{"class":547,"line":977},[545,2058,2059],{"class":665},"      crawlLinks",[545,2061,534],{"class":559},[545,2063,689],{"class":650},[545,2065,2066],{"class":547,"line":1005},[545,2067,2068],{"class":559},"    }\n",[545,2070,2071],{"class":547,"line":1044},[545,2072,695],{"class":559},[545,2074,2075,2077],{"class":547,"line":1057},[545,2076,906],{"class":559},[545,2078,1105],{"class":555},[470,2080,2082],{"id":2081},"why-this-actually-matters","Why This Actually Matters",[463,2084,2085,2086,2089],{},"The real reason to use ",[500,2087,2088],{},"autoSubfolderIndex: false"," isn't just fixing the 404. It's your analytics.",[463,2091,2092],{},"Without the fix, Umami (or whatever you use) sees:",[536,2094,2099],{"className":2095,"code":2097,"language":2098},[2096],"language-text","/blog/my-post       → 45 views\n/blog/my-post/      → 23 views\n","text",[500,2100,2097],{"__ignoreMap":541},[463,2102,2103],{},"Which number do you use? Neither's correct. You're splitting traffic across two URLs.",[463,2105,2106],{},"With the fix:",[536,2108,2111],{"className":2109,"code":2110,"language":2098},[2096],"/blog/my-post       → 68 views\n",[500,2112,2110],{"__ignoreMap":541},[463,2114,2115],{},"One canonical URL. Accurate numbers. SEO doesn't get confused by duplicate content. Everyone's happy.",[470,2117,2119],{"id":2118},"bottom-line","Bottom Line",[463,2121,2122],{},"You would think AI will help these kind of issues easily, it just side tracked me this time, making the fix take longer than it should.",[463,2124,2125],{},"Prerendering is great for performance and reducing server load. But small config details can break things in unexpected ways.\nIt was another reminder to always test the built app in preview mode before pushing to production. Catch these issues early.",[463,2127,2128],{},"With good setup, the fix can be deployed quickly and painlessly. Anyway, there are many things that break in the cloud - so the preview is not always enough, but it helps a lot.",[819,2130],{},[2132,2133],"callout-form",{"button-icon":179,"button-text":2134,"className":2135,"color":460,"description":2138,"form-action":2139,"icon":2140,"title":2141},"Get in Touch",[2136,2137],"border-dashed","hover:border-inverted","Running into prerendering issues or need help optimizing your Nuxt site? We can help you debug, optimize, and get your app deployed the right way.","inquiry-form","i-lucide-headset","Need Help with Your Nuxt App?",[2143,2144,2145],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":541,"searchDepth":631,"depth":631,"links":2147},[2148,2149,2150,2151,2152,2153,2156,2157,2158],{"id":472,"depth":631,"text":473},{"id":488,"depth":631,"text":489},{"id":519,"depth":631,"text":520},{"id":603,"depth":631,"text":604},{"id":718,"depth":631,"text":719},{"id":823,"depth":631,"text":824,"children":2154},[2155],{"id":1169,"depth":615,"text":1170},{"id":1294,"depth":631,"text":1295},{"id":2081,"depth":631,"text":2082},{"id":2118,"depth":631,"text":2119},"2025-12-10","Enabled prerendering for optimization. Pushed to production. Suddenly receive weird 404 error. One config line fixes it - autoSubfolderIndex","md",{"src":2163},"blog/nuxt_pixel.png",{},null,"/blog/fix-nuxt-content-404",{"title":446,"description":2160},"3.blog/2.fix-nuxt-content-404",[2170,2171,2172,2173],"Nuxt","Bug Fix","Prerendering","Cloudflare","2O8DzCVjSqmzGTIBvonXCxVZFOGEDl5UthbefjYN74M",[2176],{"title":2177,"path":2178,"stem":2179,"description":2180,"children":-1},"Self-Hosting Nuxt on Cloudflare Workers: Setup & Migration Guide","/blog/migrate-nuxthub-to-wrangler","3.blog/1.migrate-nuxthub-to-wrangler","How to deploy Nuxt directly to Cloudflare Workers with wrangler.jsonc. Includes automated scripts for setup, migrations, and deployment. Works for new projects or migrating from NuxtHub.",1772977471263]