A demo repository showing how to implement redirects from server functions in RedwoodSDK.
Standard HTTP redirects (302) don't work with server functions because of how React Server Components handle fetch requests. The browser blocks JavaScript from reading redirect headers for security reasons.
This pattern returns the redirect destination as data, which a custom transport intercepts and handles automatically.
// src/client.tsx
import {
initClient,
initClientNavigation,
navigate,
fetchTransport,
} from "rwsdk/client";
const { handleResponse } = initClientNavigation();
const redirectTransport = (
transportContext: Parameters<typeof fetchTransport>[0]
) => {
const callServer = fetchTransport(transportContext);
return async (id: string, args: unknown) => {
const result = await callServer(id, args);
if (result?.redirectTo) {
navigate(result.redirectTo);
return undefined;
}
return result;
};
};
initClient({ transport: redirectTransport, handleResponse });// src/app/redirect.ts
export function redirect(path: string) {
return { redirectTo: path };
}"use server";
import { redirect } from "@/app/redirect";
export async function submitForm(_prevState: unknown, formData: FormData) {
// Do your thing...
return redirect("/success");
}That's it. The user will be redirected to /success.
This demo shows several common redirect patterns:
- Basic Redirect - Simple redirect after a successful action
- Error Redirect - Redirect to an error page when something goes wrong
- Conditional Redirect - Redirect to different pages based on logic
pnpm install
pnpm dev