Skip to content

Return 200 for client-handled Server Action redirects - #96310

Merged
timneutkens merged 1 commit into
canaryfrom
ztanner/fix-server-action-redirect-status
Jul 28, 2026
Merged

Return 200 for client-handled Server Action redirects#96310
timneutkens merged 1 commit into
canaryfrom
ztanner/fix-server-action-redirect-status

Conversation

@ztanner

@ztanner ztanner commented Jul 28, 2026

Copy link
Copy Markdown
Member

Summary

Client-handled Server Action redirects currently return a 303 without a Location header and may include a streamed RSC response body. Some HTTP intermediaries reject this response or strip its body because it looks like an HTTP redirect.

Return 200 for client-handled Server Action redirects while continuing to use x-action-redirect and the RSC response. Progressive-enhancement form submissions still return a standards-compliant 303 with Location.

Fixes #92882
Fixes #74026

Verification

  • HEADLESS=true pnpm test-dev-turbo test/e2e/app-dir/actions/app-action.test.ts test/e2e/app-dir/app-basepath/index.test.ts test/e2e/app-dir/actions/app-action-progressive-enhancement.test.ts
  • HEADLESS=true pnpm test-start-turbo test/e2e/app-dir/actions/app-action.test.ts test/e2e/app-dir/app-basepath/index.test.ts test/e2e/app-dir/actions/app-action-progressive-enhancement.test.ts
  • pnpm --filter=next types

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 815ms 814ms ▁▂▂▂▂
Cold (Ready in log) 797ms 796ms ▁▁▂▂▁
Cold (First Request) 1.357s 1.343s ▁▁▃▂▂
Warm (Listen) 815ms 813ms ▁▂▂▂▂
Warm (Ready in log) 798ms 804ms ▁▁▂▁▁
Warm (First Request) 1.328s 1.348s ▂▁▃▂▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 813ms 812ms ▁▅▄▁▁
Cold (Ready in log) 795ms 794ms ▁▅▂▂▁
Cold (First Request) 3.439s 3.405s ▃▃▁▁▂
Warm (Listen) 813ms 813ms ▁██▁█
Warm (Ready in log) 802ms 790ms ▁▄▂▂▄
Warm (First Request) 3.528s 3.428s ▂▃▁▁▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 5.500s 5.344s ▁▁▃▂▂
Cached Build 5.411s 5.557s ▁▁▄▂▂
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 25.191s 24.902s ▃▅▂▃▄
Cached Build 25.528s 25.207s ▁▄▁▂▁
node_modules Size 550 MB 550 MB █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
00984xh3ankve.js gzip 7.4 kB N/A -
00lv61-dw-p1s.js gzip 71.2 kB N/A -
0a-p0meqxynjz.js gzip 10.3 kB N/A -
0avtke4yefj4-.js gzip 13.1 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0fkgqovmj3kd_.js gzip 156 B N/A -
0pt5of3ch6d2u.js gzip 13.6 kB N/A -
0s_6le5473zon.js gzip 153 B N/A -
0utq7k-24q3k_.js gzip 157 B N/A -
0xnsdo-6y9r3k.js gzip 5.72 kB N/A -
0yi7is8u4covm.js gzip 8.77 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1prv-wg6jgtt2.js gzip 8.77 kB N/A -
1t47vod02e_4a.js gzip 8.75 kB N/A -
1tf1phijqlx9j.js gzip 220 B 220 B
1tw002sq5bo4l.js gzip 10 kB N/A -
1wlerik1n7zbr.js gzip 8.7 kB N/A -
2_zr4masp3rwy.js gzip 155 B N/A -
25xtago53_2xf.js gzip 160 B N/A -
2b2322zzwplhu.js gzip 161 B N/A -
2lviwqiqxm904.js gzip 3.52 kB N/A -
2pevdqjpbf3xk.js gzip 9.45 kB N/A -
2qd2anu9eizlz.js gzip 8.75 kB N/A -
2se72tcn7ulb_.js gzip 154 B N/A -
2sv39ae5_8vfj.js gzip 8.81 kB N/A -
2utx6n7w65xqa.js gzip 8.7 kB N/A -
2x2jbjxj8_k8h.js gzip 155 B N/A -
3-mgi7apkkmqn.js gzip 169 B N/A -
3-ukivglqkfeq.js gzip 8.78 kB N/A -
325xisqrylugu.js gzip 450 B N/A -
32fs4p58op4zm.js gzip 65.6 kB N/A -
367gc92a9294o.js gzip 158 B N/A -
3eswx3idwrkj8.js gzip 46.2 kB N/A -
3jc9ghvds1spf.js gzip 2.29 kB N/A -
3juwkvkgvywfe.js gzip 10.6 kB N/A -
3kbove7q58uqh.js gzip 13.2 kB N/A -
3kyroy-o6ffl5.js gzip 154 B N/A -
3md__14nrd0du.js gzip 156 B N/A -
3qn7vntp30gaj.js gzip 1.47 kB N/A -
3yz9mvl23_vys.js gzip 156 B N/A -
turbopack-00..nycg.js gzip 3.86 kB N/A -
turbopack-03..h4gn.js gzip 3.85 kB N/A -
turbopack-04..7jl6.js gzip 3.84 kB N/A -
turbopack-07..hdpt.js gzip 3.85 kB N/A -
turbopack-07..6ba4.js gzip 3.84 kB N/A -
turbopack-0a..weg2.js gzip 3.84 kB N/A -
turbopack-0a..ncn4.js gzip 3.85 kB N/A -
turbopack-0b..vyhj.js gzip 3.84 kB N/A -
turbopack-16..dn94.js gzip 3.84 kB N/A -
turbopack-1a..ymrt.js gzip 3.84 kB N/A -
turbopack-20..b45f.js gzip 3.85 kB N/A -
turbopack-2f..he3a.js gzip 3.82 kB N/A -
turbopack-3s..7_iy.js gzip 3.84 kB N/A -
turbopack-3y..s536.js gzip 3.84 kB N/A -
0_9-hrvr12n53.js gzip N/A 161 B -
030a1njeh5b77.js gzip N/A 10 kB -
04_0pje58tdal.js gzip N/A 153 B -
0762ohcfs5hmh.js gzip N/A 65.6 kB -
0ot0qt5np20h7.js gzip N/A 8.78 kB -
0t_fggm0_xxpv.js gzip N/A 156 B -
12m9rr7_7cexd.js gzip N/A 8.7 kB -
186r3y_rfvr0b.js gzip N/A 8.78 kB -
19kp1_j23-9g0.js gzip N/A 162 B -
19v97848yrjp7.js gzip N/A 8.81 kB -
1nd_0rwgz2ozk.js gzip N/A 9.45 kB -
1oi9pltr_e10m.js gzip N/A 10.6 kB -
1rd9tzqgzsz2w.js gzip N/A 8.77 kB -
1rq1g_cwv642d.js gzip N/A 10.3 kB -
1uojw_uabeg93.js gzip N/A 450 B -
1w-7lusgyl81y.js gzip N/A 8.7 kB -
1yf84zzm98oee.js gzip N/A 157 B -
21h56wdn9zddo.js gzip N/A 8.75 kB -
2fzbtehq6od5d.js gzip N/A 158 B -
2ia9jsnzvw1z_.js gzip N/A 158 B -
2lg10omv7xu14.js gzip N/A 3.52 kB -
2m7pysadpv9jx.js gzip N/A 170 B -
2ovff1533zvno.js gzip N/A 13.2 kB -
2s4z8jy0z7v93.js gzip N/A 1.46 kB -
2tbr9ffg2xryn.js gzip N/A 46.2 kB -
2w9le8joqnx61.js gzip N/A 7.41 kB -
2y6gb5bs4mnam.js gzip N/A 8.75 kB -
30-xsnotaxkq2.js gzip N/A 155 B -
341h71ln1jpl3.js gzip N/A 2.29 kB -
34ttpt_n7605h.js gzip N/A 5.72 kB -
36ckfq9o-ys-a.js gzip N/A 13.1 kB -
3cm252vtfpe45.js gzip N/A 157 B -
3duxb6r04415w.js gzip N/A 156 B -
3euhi91ylya-8.js gzip N/A 157 B -
3ux8nb4tavd-x.js gzip N/A 71.2 kB -
3vdh6_u50pu5t.js gzip N/A 13.6 kB -
3xpdobk_3xyd8.js gzip N/A 156 B -
turbopack-0_..ipuo.js gzip N/A 3.82 kB -
turbopack-0i..n_6b.js gzip N/A 3.85 kB -
turbopack-0u..57xm.js gzip N/A 3.84 kB -
turbopack-14..t3l7.js gzip N/A 3.85 kB -
turbopack-1i..1rnb.js gzip N/A 3.85 kB -
turbopack-1m..0fd7.js gzip N/A 3.85 kB -
turbopack-1o..7l0x.js gzip N/A 3.85 kB -
turbopack-1s..ysh5.js gzip N/A 3.85 kB -
turbopack-3-..zru6.js gzip N/A 3.85 kB -
turbopack-37..xvtz.js gzip N/A 3.85 kB -
turbopack-39..4wym.js gzip N/A 3.86 kB -
turbopack-3a..bncu.js gzip N/A 3.84 kB -
turbopack-3e..vk0g.js gzip N/A 3.85 kB -
turbopack-41..obw3.js gzip N/A 3.84 kB -
Total 450 kB 450 kB ⚠️ +61 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 776 B 774 B
Total 776 B 774 B ✅ -2 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 432 B 436 B
Total 432 B 436 B ⚠️ +4 B

📦 Webpack

Client

Main Bundles
Canary PR Change
3322-HASH.js gzip 64.8 kB N/A -
4191.HASH.js gzip 169 B N/A -
7920-HASH.js gzip 4.68 kB N/A -
9784-HASH.js gzip 5.63 kB N/A -
b1ad9f4c-HASH.js gzip 63 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 254 B 253 B
main-HASH.js gzip 40 kB 40 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
3577.HASH.js gzip N/A 168 B -
578-HASH.js gzip N/A 65.6 kB -
8590-HASH.js gzip N/A 5.61 kB -
9750-HASH.js gzip N/A 4.69 kB -
a8984546-HASH.js gzip N/A 63 kB -
Total 240 kB 241 kB ⚠️ +662 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 193 B
_error-HASH.js gzip 181 B 182 B
css-HASH.js gzip 334 B 331 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 255 B 253 B
head-HASH.js gzip 349 B 351 B
hooks-HASH.js gzip 382 B 384 B
image-HASH.js gzip 581 B 582 B
index-HASH.js gzip 260 B 259 B
link-HASH.js gzip 2.48 kB 2.48 kB
routerDirect..HASH.js gzip 317 B 318 B
script-HASH.js gzip 384 B 386 B
withRouter-HASH.js gzip 316 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.95 kB 7.95 kB ⚠️ +1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 129 kB 128 kB
page.js gzip 292 kB 293 kB
Total 421 kB 421 kB ⚠️ +186 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 620 B 617 B
middleware-r..fest.js gzip 156 B 156 B
middleware.js gzip 45.8 kB 45.2 kB 🟢 527 B (-1%)
edge-runtime..pack.js gzip 842 B 842 B
Total 47.4 kB 46.8 kB ✅ -530 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 718 B 718 B
Total 718 B 718 B
Build Cache
Canary PR Change
0.pack gzip 4.82 MB 4.82 MB
index.pack gzip 123 kB 124 kB
index.pack.old gzip 123 kB 123 kB
Total 5.07 MB 5.07 MB ✅ -2.21 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 372 kB 372 kB
app-page-exp..prod.js gzip 205 kB 205 kB
app-page-tur...dev.js gzip 371 kB 371 kB
app-page-tur..prod.js gzip 205 kB 205 kB
app-page-tur...dev.js gzip 368 kB 368 kB
app-page-tur..prod.js gzip 203 kB 203 kB
app-page.run...dev.js gzip 368 kB 368 kB
app-page.run..prod.js gzip 203 kB 203 kB
app-route-ex...dev.js gzip 82.5 kB 82.5 kB
app-route-ex..prod.js gzip 55.9 kB 55.9 kB
app-route-tu...dev.js gzip 82.5 kB 82.5 kB
app-route-tu..prod.js gzip 56 kB 56 kB
app-route-tu...dev.js gzip 82.1 kB 82.1 kB
app-route-tu..prod.js gzip 55.7 kB 55.7 kB
app-route.ru...dev.js gzip 82.1 kB 82.1 kB
app-route.ru..prod.js gzip 55.7 kB 55.7 kB
dev-validati...dev.js gzip 132 kB 132 kB
dev-validati...dev.js gzip 132 kB 132 kB
dev-validati...dev.js gzip 130 kB 130 kB
dev-validati...dev.js gzip 130 kB 130 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 45.5 kB 45.5 kB
pages-api-tu..prod.js gzip 34.1 kB 34.1 kB
pages-api.ru...dev.js gzip 45.5 kB 45.5 kB
pages-api.ru..prod.js gzip 34.1 kB 34.1 kB
pages-turbo....dev.js gzip 54.9 kB 54.9 kB
pages-turbo...prod.js gzip 39.8 kB 39.8 kB
pages.runtim...dev.js gzip 54.9 kB 54.9 kB
pages.runtim..prod.js gzip 39.8 kB 39.8 kB
server.runti..prod.js gzip 68.3 kB 68.3 kB
use-cache-pr...dev.js gzip 72 kB 72 kB
use-cache-pr...dev.js gzip 72 kB 72 kB
use-cache-pr...dev.js gzip 70.4 kB 70.4 kB
use-cache-pr...dev.js gzip 70.4 kB 70.4 kB
Total 4.08 MB 4.08 MB ⚠️ +74 B
📝 Changed Files (8 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
View diffs
app-page-exp..ntime.dev.js

Diff too large to display

app-page-exp..time.prod.js

Diff too large to display

app-page-tur..ntime.dev.js

Diff too large to display

app-page-tur..time.prod.js

Diff too large to display

app-page-tur..ntime.dev.js

Diff too large to display

app-page-tur..time.prod.js

Diff too large to display

app-page.runtime.dev.js

Diff too large to display

app-page.runtime.prod.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/50d7538862716507e252e28ef730dcef0764c281/next

Commit: 50d7538

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Tests Passed

Commit: 50d7538

@ztanner
ztanner marked this pull request as ready for review July 28, 2026 19:27
@ztanner
ztanner requested review from acdlite and timneutkens July 28, 2026 19:28
@timneutkens
timneutkens merged commit ccfe67a into canary Jul 28, 2026
228 of 230 checks passed
@timneutkens
timneutkens deleted the ztanner/fix-server-action-redirect-status branch July 28, 2026 20:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants