SplatDev.Umbraco.Plugins.RedirectManager
2.1.9
See the version list below for details.
dotnet add package SplatDev.Umbraco.Plugins.RedirectManager --version 2.1.9
NuGet\Install-Package SplatDev.Umbraco.Plugins.RedirectManager -Version 2.1.9
<PackageReference Include="SplatDev.Umbraco.Plugins.RedirectManager" Version="2.1.9" />
<PackageVersion Include="SplatDev.Umbraco.Plugins.RedirectManager" Version="2.1.9" />
<PackageReference Include="SplatDev.Umbraco.Plugins.RedirectManager" />
paket add SplatDev.Umbraco.Plugins.RedirectManager --version 2.1.9
#r "nuget: SplatDev.Umbraco.Plugins.RedirectManager, 2.1.9"
#:package SplatDev.Umbraco.Plugins.RedirectManager@2.1.9
#addin nuget:?package=SplatDev.Umbraco.Plugins.RedirectManager&version=2.1.9
#tool nuget:?package=SplatDev.Umbraco.Plugins.RedirectManager&version=2.1.9
RedirectManager
Umbraco redirect manager plugin — CRUD for URL redirects with a backoffice dashboard, NPoco-backed persistence, pattern-based redirects, and a front-end 301 fallback handler. Supports Umbraco 13 (net8.0) and Umbraco 17 (net10.0).

Compatibility
| Umbraco | .NET | Package Version |
|---|---|---|
| 13.x | 8.0 | 2.0.0 |
| 17.x | 10.0 | 2.0.0 |
Installation
dotnet add package SplatDev.Umbraco.Plugins.RedirectManager
Quick Start
Register in Program.cs:
builder.CreateUmbracoBuilder()
.AddBackOffice()
.AddWebsite()
.AddRedirectManager() // <-- add this
.Build();
On first startup, the plugin runs a migration creating the redirectUrls table.
Configuration
Add to appsettings.json:
{
"RedirectManager": {
"BasePath": "/quotes",
"ValidateParameters": true,
"RateLimitPermit": 100,
"RateLimitWindowSeconds": 60
}
}
| Key | Default | Description |
|---|---|---|
BasePath |
/quotes |
Base path for regex/pattern matching |
ValidateParameters |
true |
Whether to validate incoming URL parameters |
RateLimitPermit |
100 |
Max redirects per rate-limit window |
RateLimitWindowSeconds |
60 |
Rate-limit window duration |
Usage
Backoffice API
The RedirectManagerController exposes a REST API at /umbraco/backoffice/api/RedirectManager/:
| Method | Route | Description |
|---|---|---|
GET |
GetAll |
List all redirect URLs |
GET |
Get?id= |
Get single redirect by ID |
POST |
Post |
Create a new redirect |
PUT |
Put |
Update an existing redirect |
DELETE |
Delete?id= |
Delete by ID |
DELETE |
DeleteAll |
Remove all redirects |
Programmatic Usage
using SplatDev.Umbraco.Plugins.RedirectManager.Models;
using SplatDev.Umbraco.Plugins.RedirectManager.Repositories;
var repo = new RedirectUrlsRepository(dbFactory);
// Add a redirect
repo.AddRedirectionUrl(new RedirectUrl
{
Url = "/old-blog/2023/post-slug",
RedirectToUrl = "/blog/post-slug",
CreatedOn = DateTime.UtcNow
});
// Look up a redirect
var match = repo.GetRedirectionUrl("/old-blog/2023/post-slug");
// → RedirectUrl { Url = "/old-blog/2023/post-slug", RedirectToUrl = "/blog/post-slug" }
Front-End Fallback
The FrontEndRedirectionController provides a "last resort" check — call it from your 404 handler:
_fallbackRedirect.LastResortCheckIfUrlHasRedirect(
requestedUrl: "/old-page/",
response: HttpContext.Response
);
// Issues 301 redirect if a matching entry exists, does nothing otherwise.
Pattern-Based Redirects
The RegexRedirectComposer + PatternUrlRedirector handle bulk redirects via regex patterns:
// Config-based pattern matching
// e.g. "/quotes/by-id/{id}" → "/products/{id}"
Architecture
| Component | Role |
|---|---|
RedirectUrl (NPoco entity) |
redirectUrls table — Url, RedirectToUrl, CreatedOn |
RedirectUrlsRepository |
CRUD + lookup by exact URL match |
RedirectManagerController |
Backoffice REST API (auth-gated) |
FrontEndRedirectionController |
301 fallback from 404 handler |
RegexRedirectComposer |
Pattern-based redirect pipeline |
RedirectConfiguration |
Rate limiting and path configuration |
Changelog
2.1.9 — 2026-08-24
Package metadata only: the listing now carries an icon and search tags, and the project and repository links point at the organisation that actually hosts this code. No code changes.
2.1.8 — 2026-08-22
- The dashboard can reach its API on Umbraco 17. Umbraco 13 routed the controller by convention at
/umbraco/backoffice/api/RedirectManager/…; Umbraco 17 does not route its management controllers that way, so nothing was mapped and every call 404'd. The controller now declares an explicit route on the Umbraco 17 target, and the dashboard calls it. Umbraco 13 keeps the URL its AngularJS bundle already uses.
2.1.7 — 2026-08-21
- A failed request now says so in the dashboard. Previously the dashboard kept its previous (usually empty) state, so a refused or failed call looked identical to having no data.
2.1.6 — 2026-08-21
- Dashboard now sends the backoffice token with its API calls. On Umbraco 17 those calls were arriving unauthenticated and coming back 401, which the dashboard rendered as an empty state rather than an error.
- A failed request now raises a notification instead of leaving the dashboard looking like there is simply no data.
License
MIT © SplatDev
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.FileProviders.Embedded (>= 10.0.6)
- Umbraco.Cms.Api.Management (>= 17.3.4)
- Umbraco.Cms.Web.Website (>= 17.3.4)
-
net8.0
- Microsoft.Extensions.FileProviders.Embedded (>= 8.0.11)
- Umbraco.Cms.Web.BackOffice (>= 13.12.0)
- Umbraco.Cms.Web.Website (>= 13.12.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.