Skip to content
GitHubXDiscord

RedirectRule

A Cloudflare Redirect Rule enables URL redirects and rewrites using Cloudflare’s Rules engine. Supports wildcard redirects, static redirects, and dynamic redirects with expressions.

Create a basic redirect rule that redirects all requests to a target URL:

import { RedirectRule } from "alchemy/cloudflare";
const redirect = await RedirectRule("basic-redirect", {
zone: "example.com",
targetUrl: "https://example.com/",
statusCode: 301,
});

Redirect from a wildcard pattern to a target URL with placeholders:

import { RedirectRule } from "alchemy/cloudflare";
const wildcardRedirect = await RedirectRule("wildcard-redirect", {
zone: "example.com",
requestUrl: "https://*.example.com/files/*",
targetUrl: "https://example.com/${1}/files/${2}",
statusCode: 301,
preserveQueryString: true,
});

Create complex redirects using Cloudflare’s Rules language for advanced matching:

import { RedirectRule } from "alchemy/cloudflare";
const dynamicRedirect = await RedirectRule("dynamic-redirect", {
zone: "example.com",
expression: 'http.request.uri.path matches "/autodiscover\\.(xml|src)$"',
targetUrl: "https://example.com/not-found",
statusCode: 301,
preserveQueryString: true,
});

Configure redirects with various HTTP status codes:

import { RedirectRule } from "alchemy/cloudflare";
// Temporary redirect
const temporaryRedirect = await RedirectRule("temp-redirect", {
zone: "example.com",
requestUrl: "https://example.com/temp/*",
targetUrl: "https://example.com/new/${1}",
statusCode: 302,
});
// Permanent redirect
const permanentRedirect = await RedirectRule("perm-redirect", {
zone: "example.com",
requestUrl: "https://example.com/old/*",
targetUrl: "https://example.com/new/${1}",
statusCode: 301,
});

Control whether query string parameters are preserved in redirects:

import { RedirectRule } from "alchemy/cloudflare";
// Preserve query strings (default)
const preserveQuery = await RedirectRule("preserve-query", {
zone: "example.com",
requestUrl: "https://example.com/search/*",
targetUrl: "https://example.com/find/${1}",
preserveQueryString: true,
});
// Drop query strings
const dropQuery = await RedirectRule("drop-query", {
zone: "example.com",
requestUrl: "https://example.com/old/*",
targetUrl: "https://example.com/new/${1}",
preserveQueryString: false,
});

Reference an existing zone resource instead of zone ID:

import { RedirectRule, Zone } from "alchemy/cloudflare";
const zone = await Zone("my-zone", {
name: "example.com",
type: "full",
});
const redirect = await RedirectRule("zone-redirect", {
zone: zone,
targetUrl: "https://example.com/",
statusCode: 301,
});