Redirecting all paths on a Vercel instance

I wanted to redirect all traffic to https://something.vercel.app/ to a different domain - preserving the path and the querystring and serving a 301 status code.

The Vercel redirects documentation doesn't mention that you can capture patterns from the source and place them in the destination. The example they give is:

{
  "redirects": [
    { "source": "/me", "destination": "/profile.html" },
    { "source": "/user", "destination": "/api/user", "permanent": false },
    { "source": "/view-source", "destination": "https://github.com/vercel/vercel" }
  ]
}

It turns out you can use (.*) in the source and then $1 in the destination. Here's the example that worked for me:

{
    "redirects": [
        {
            "source": "/(.*)",
            "destination": "https://timezones-api.datasette.io/$1",
            "statusCode": 301
        }
    ]
}

Vercel use 307 and 308 HTTP status codes. I prefer 301 and 302 which is why I used statusCode above instead of their "permanent": true.

Here's how I deployed it:

~ % cd /tmp
/tmp % mkdir timezones-api
/tmp % cd timezones-api 
timezones-api % echo '{
    "redirects": [
        {
            "source": "/(.*)",
            "destination": "https://timezones-api.datasette.io/$1",
            "statusCode": 301
        }
    ]
}
' > vercel.json
timezones-api % vercel 
Vercel CLI 19.2.0
> NOTE: Deploying to Now 2.0 automatically. More: https://vercel.com/docs/version-detection
? Set up and deploy “/private/tmp/timezones-api”? [Y/n] y
? Which scope do you want to deploy to? simonw
? Found project “simonw/timezones-api”. Link to it? [Y/n] y
🔗  Linked to simonw/timezones-api (created .vercel and added it to .gitignore)
No framework detected. Default Project Settings:
- Build Command: `npm run vercel-build` or `npm run build`
- Output Directory: `public` if it exists, or `.`
- Development Command: None
? Want to override the settings? [y/N] y
? Which settings would you like to overwrite (select multiple)? None
🔍  Inspect: https://vercel.com/simonw/timezones-api-cn71cufah/simonw [1s]
✅  Production: https://timezones-api-simonw.vercel.app [copied to clipboard] [10s]
📝  Deployed to production. Run `vercel --prod` to overwrite later (https://vercel.link/2F).
💡  To change the domain or build command, go to https://vercel.com/simonw/timezones-api/settings

Created 2021-03-27T08:45:13-07:00 · Edit