diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx
index 7898f7504b966..ce51949a97bb8 100644
--- a/packages/next/server/app-render.tsx
+++ b/packages/next/server/app-render.tsx
@@ -874,7 +874,13 @@ export async function renderToHTMLOrFlight(
}
const key = segmentParam.param
- const value = pathParams[key]
+ let value = pathParams[key]
+
+ if (Array.isArray(value)) {
+ value = value.map((i) => encodeURIComponent(i))
+ } else if (typeof value === 'string') {
+ value = encodeURIComponent(value)
+ }
if (!value) {
// Handle case where optional catchall does not have a value, e.g. `/dashboard/[...slug]` when requesting `/dashboard`
diff --git a/test/production/app-dir-prefetch-non-iso-url/app/[slug]/page.js b/test/production/app-dir-prefetch-non-iso-url/app/[slug]/page.js
new file mode 100644
index 0000000000000..90ee69c678574
--- /dev/null
+++ b/test/production/app-dir-prefetch-non-iso-url/app/[slug]/page.js
@@ -0,0 +1,12 @@
+export default function Slug(props) {
+ return (
+ <>
+
/[slug]
+
{JSON.stringify(props)}
+ >
+ )
+}
+
+export function generateStaticParams() {
+ return [{ slug: 'iso-url' }, { slug: 'кириллица' }]
+}
diff --git a/test/production/app-dir-prefetch-non-iso-url/app/layout.js b/test/production/app-dir-prefetch-non-iso-url/app/layout.js
new file mode 100644
index 0000000000000..750eb927b1980
--- /dev/null
+++ b/test/production/app-dir-prefetch-non-iso-url/app/layout.js
@@ -0,0 +1,7 @@
+export default function Layout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/test/production/app-dir-prefetch-non-iso-url/app/page.js b/test/production/app-dir-prefetch-non-iso-url/app/page.js
new file mode 100644
index 0000000000000..786b1ea934a51
--- /dev/null
+++ b/test/production/app-dir-prefetch-non-iso-url/app/page.js
@@ -0,0 +1,18 @@
+import Link from 'next/link'
+
+export default function Page(props) {
+ return (
+ <>
+