summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matt Kane <m@mk.gg> 2025-03-21 10:48:15 +0000
committerGravatar GitHub <noreply@github.com> 2025-03-21 10:48:15 +0000
commit12cc4d88f216ba3f684ddffb33d117baa7197726 (patch)
tree854b741f8dd8b1d4d0f840f0df334074cce27865
parent9a0808cf18172f14fd6ddaa77eecf74093767348 (diff)
downloadastro-12cc4d88f216ba3f684ddffb33d117baa7197726.tar.gz
astro-12cc4d88f216ba3f684ddffb33d117baa7197726.tar.zst
astro-12cc4d88f216ba3f684ddffb33d117baa7197726.zip
fix: generate correct external redirects (#13480)
-rw-r--r--.changeset/little-doors-tickle.md5
-rw-r--r--packages/integrations/vercel/src/lib/redirects.ts12
-rw-r--r--packages/integrations/vercel/test/redirects.test.js8
3 files changed, 21 insertions, 4 deletions
diff --git a/.changeset/little-doors-tickle.md b/.changeset/little-doors-tickle.md
new file mode 100644
index 000000000..ec74adbe4
--- /dev/null
+++ b/.changeset/little-doors-tickle.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/vercel': patch
+---
+
+Fixes a bug that caused external redirects to fail
diff --git a/packages/integrations/vercel/src/lib/redirects.ts b/packages/integrations/vercel/src/lib/redirects.ts
index 23a4dc11f..612c8e917 100644
--- a/packages/integrations/vercel/src/lib/redirects.ts
+++ b/packages/integrations/vercel/src/lib/redirects.ts
@@ -1,5 +1,5 @@
import nodePath from 'node:path';
-import { removeLeadingForwardSlash } from '@astrojs/internal-helpers/path';
+import { isRemotePath, removeLeadingForwardSlash } from '@astrojs/internal-helpers/path';
import type { AstroConfig, IntegrationResolvedRoute, RoutePart } from 'astro';
import type { Redirect } from '@vercel/routing-utils';
@@ -92,10 +92,14 @@ function getRedirectLocation(route: IntegrationResolvedRoute, config: AstroConfi
return pathJoin(config.base, pattern);
}
- if (typeof route.redirect === 'object') {
- return pathJoin(config.base, route.redirect.destination);
+ const destination =
+ typeof route.redirect === 'object' ? route.redirect.destination : (route.redirect ?? '');
+
+ if (isRemotePath(destination)) {
+ return destination;
}
- return pathJoin(config.base, route.redirect || '');
+
+ return pathJoin(config.base, destination);
}
function getRedirectStatus(route: IntegrationResolvedRoute): number {
diff --git a/packages/integrations/vercel/test/redirects.test.js b/packages/integrations/vercel/test/redirects.test.js
index ec28b7b6f..a76ff6ad9 100644
--- a/packages/integrations/vercel/test/redirects.test.js
+++ b/packages/integrations/vercel/test/redirects.test.js
@@ -16,6 +16,10 @@ describe('Redirects', () => {
status: 302,
destination: '/',
},
+ '/four': {
+ status: 302,
+ destination: 'http://example.com',
+ },
'/blog/[...slug]': '/team/articles/[...slug]',
'/Basic/http-2-0.html': '/posts/http2',
},
@@ -43,6 +47,10 @@ describe('Redirects', () => {
const threeRoute = config.routes.find((r) => r.src === '^/three$');
assert.equal(threeRoute.headers.Location, '/');
assert.equal(threeRoute.status, 302);
+
+ const fourRoute = config.routes.find((r) => r.src === '^/four$');
+ assert.equal(fourRoute.headers.Location, 'http://example.com');
+ assert.equal(fourRoute.status, 302);
});
it('define redirects for static files', async () => {