diff options
-rw-r--r-- | .changeset/little-doors-tickle.md | 5 | ||||
-rw-r--r-- | packages/integrations/vercel/src/lib/redirects.ts | 12 | ||||
-rw-r--r-- | packages/integrations/vercel/test/redirects.test.js | 8 |
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 () => { |