diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index 7ea3a73fd222..58b8d13ee063 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -180,7 +180,10 @@ export default defineRenderHandler(async (event) => { } if (ssrError && event.node.req.socket.readyState !== 'readOnly' /* direct request */) { - throw createError('Cannot directly render error page!') + throw createError({ + statusCode: 404, + statusMessage: 'Page Not Found: /__nuxt_error' + }) } // Check for island component rendering diff --git a/test/basic.test.ts b/test/basic.test.ts index a8c1331fbfc3..ee52af09892f 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -574,6 +574,25 @@ describe('errors', () => { expect(await res.text()).toContain('This is a custom error') }) + it('should not allow accessing error route directly', async () => { + const res = await fetch('/__nuxt_error', { + headers: { + accept: 'application/json' + } + }) + expect(res.status).toBe(404) + const error = await res.json() + delete error.stack + expect(error).toMatchInlineSnapshot(` + { + "message": "Page Not Found: /__nuxt_error", + "statusCode": 404, + "statusMessage": "Page Not Found: /__nuxt_error", + "url": "/__nuxt_error", + } + `) + }) + // TODO: need to create test for webpack it.runIf(!isDev() && !isWebpack)('should handle chunk loading errors', async () => { const { page, consoleLogs } = await renderPage('/')