Skip to content

Prevent static assets from being caught by catch-all routes#16047

Merged
matthewp merged 4 commits intomainfrom
node-middleware-missing-assets
Mar 27, 2026
Merged

Prevent static assets from being caught by catch-all routes#16047
matthewp merged 4 commits intomainfrom
node-middleware-missing-assets

Conversation

@matthewp
Copy link
Copy Markdown
Contributor

@matthewp matthewp commented Mar 23, 2026

Changes

  • ssrAssetsPerEnvironment is a recently added property that's used to know what to copy over to the client folder
  • This iterates over them and adds them to the manifest so the Node adapter knows to serve them.

Testing

  • Added a new fixture packages/integrations/node/test/fixtures/ssr-assets-middleware/ with an index.astro that imports a CSS file and a [...path].astro catch-all page — the minimal setup required to reproduce the bug.
  • Added a regression test in node-middleware.test.js (middleware with fastify and catch-all route: SSR assets in manifest) that builds with assetsInlineLimit: 0, starts a Fastify server, and asserts that requesting the CSS asset URL returns text/css rather than text/html from the catch-all. The test fails on unfixed code and passes with the fix.

Docs

No docs update needed — this is a bug fix restoring documented behavior with no API changes.

Fixes #16039

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 23, 2026

🦋 Changeset detected

Latest commit: cc3efea

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions bot added pkg: integration Related to any renderer integration (scope) pkg: astro Related to the core `astro` package (scope) labels Mar 23, 2026
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq bot commented Mar 23, 2026

Merging this PR will not alter performance

✅ 18 untouched benchmarks


Comparing node-middleware-missing-assets (cc3efea) with main (47694d0)

Open in CodSpeed

@matthewp matthewp marked this pull request as ready for review March 24, 2026 13:06
Copy link
Copy Markdown
Member

@delucis delucis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noting that our docs say

Note that middleware mode does not do file serving. You’ll need to configure your HTTP framework to do that for you. By default the client assets are written to ./dist/client/.

I guess these assets are unrelated to that?

@matthewp matthewp changed the title Node adapter middleware mode: serve SSR-emitted assets instead of matching catch-all routes Prevent static assets from being caught by catch-all routes Mar 27, 2026
@matthewp
Copy link
Copy Markdown
Contributor Author

@delucis The description wasn't great so I updated it.

Middleware mode doesn't serve static assets. The bug was that static assets were being caught by catch-all routes [...path].astro because we didn't have them in manifest.assets. Here is where we return undefined if a request is for static assets:

if (this.manifest.assets.has(url.pathname)) return undefined;

So this was preventing the request from hitting the next middleware (see the test, it's the fastify static middleware)

'astro': patch
---

Fixes CSS, fonts, and other assets failing to load when using `@astrojs/node` in middleware mode with a catch-all route. Previously these assets were incorrectly matched by the catch-all instead of being served as static files.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the clarification! Maybe we can tweak the changeset to describe that and not suggest that those assets will definitely load (if a user doesn’t add their own static file middleware)?

Suggested change
Fixes CSS, fonts, and other assets failing to load when using `@astrojs/node` in middleware mode with a catch-all route. Previously these assets were incorrectly matched by the catch-all instead of being served as static files.
Fixes catch-all routes incorrectly intercepting requests for static assets when using the `@astrojs/node` adapter in middleware mode.

Otherwise all looks good to me!

@matthewp matthewp merged commit 711f837 into main Mar 27, 2026
44 of 45 checks passed
@matthewp matthewp deleted the node-middleware-missing-assets branch March 27, 2026 18:32
@astrobot-houston astrobot-houston mentioned this pull request Mar 27, 2026
dadezzz pushed a commit to dadezzz/ice-notes that referenced this pull request Apr 5, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [astro](https://astro.build) ([source](https://github.com/withastro/astro/tree/HEAD/packages/astro)) | [`6.1.1` → `6.1.3`](https://renovatebot.com/diffs/npm/astro/6.1.1/6.1.3) | ![age](https://developer.mend.io/api/mc/badges/age/npm/astro/6.1.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/astro/6.1.1/6.1.3?slim=true) |

---

### Release Notes

<details>
<summary>withastro/astro (astro)</summary>

### [`v6.1.3`](https://github.com/withastro/astro/blob/HEAD/packages/astro/CHANGELOG.md#613)

[Compare Source](https://github.com/withastro/astro/compare/astro@6.1.2...astro@6.1.3)

##### Patch Changes

- [#&#8203;16161](withastro/astro#16161) [`b51f297`](withastro/astro@b51f297) Thanks [@&#8203;matthewp](https://github.com/matthewp)! - Fixes a dev rendering issue with the Cloudflare adapter where head metadata could be missing and dev CSS/scripts could be injected in the wrong place

- [#&#8203;16110](withastro/astro#16110) [`de669f0`](withastro/astro@de669f0) Thanks [@&#8203;tmimmanuel](https://github.com/tmimmanuel)! - Fixes skew protection query parameters not being appended to inter-chunk JavaScript imports in client bundles, which could cause version mismatches during rolling deployments on Vercel

- [#&#8203;16162](withastro/astro#16162) [`a0a49e9`](withastro/astro@a0a49e9) Thanks [@&#8203;rururux](https://github.com/rururux)! - Fixes an issue where HMR would not trigger when modifying files while using [@&#8203;astrojs/cloudflare](https://github.com/astrojs/cloudflare) with prerenderEnvironment: 'node' enabled.

- [#&#8203;16142](withastro/astro#16142) [`7454854`](withastro/astro@7454854) Thanks [@&#8203;rururux](https://github.com/rururux)! - Fixes HTML content being incorrectly escaped as plain text when rendering a MDX component using the `AstroContainer` APIs.

- [#&#8203;16116](withastro/astro#16116) [`12602a9`](withastro/astro@12602a9) Thanks [@&#8203;riderx](https://github.com/riderx)! - Fixes a bug where page-level CSS could leak between unrelated pages when traversing style parents across top-level route boundaries

- [#&#8203;16178](withastro/astro#16178) [`a7e7567`](withastro/astro@a7e7567) Thanks [@&#8203;matthewp](https://github.com/matthewp)! - Fixes SSR builds failing with "No matching renderer found" when a project only has injected routes and no `src/pages/` directory

### [`v6.1.2`](https://github.com/withastro/astro/blob/HEAD/packages/astro/CHANGELOG.md#612)

[Compare Source](https://github.com/withastro/astro/compare/astro@6.1.1...astro@6.1.2)

##### Patch Changes

- [#&#8203;16104](withastro/astro#16104) [`47a394d`](withastro/astro@47a394d) Thanks [@&#8203;matthewp](https://github.com/matthewp)! - Fixes `astro preview` ignoring `vite.preview.allowedHosts` set in `astro.config.mjs`

- [#&#8203;16047](withastro/astro#16047) [`711f837`](withastro/astro@711f837) Thanks [@&#8203;matthewp](https://github.com/matthewp)! - Fixes catch-all routes incorrectly intercepting requests for static assets when using the `@astrojs/node` adapter in middleware mode.

- [#&#8203;15981](withastro/astro#15981) [`a60cbb6`](withastro/astro@a60cbb6) Thanks [@&#8203;moktamd](https://github.com/moktamd)! - Fix Zod v4 validation error formatting to show human-readable messages instead of raw JSON

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My45OS4xIiwidXBkYXRlZEluVmVyIjoiNDMuOTkuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Renovate Bot <renovate@zarantonello.dev>
Co-committed-by: Renovate Bot <renovate@zarantonello.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pkg: astro Related to the core `astro` package (scope) pkg: integration Related to any renderer integration (scope)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Built assets are not served by the Node adapter in middleware mode

2 participants