sgalinski / sg-routes
URL Redirects and Page Not Found Handling
Package info
gitlab.sgalinski.de/typo3/sg_routes.git
Type:typo3-cms-extension
pkg:composer/sgalinski/sg-routes
Requires
- typo3/cms-core: ^13.4.0
- typo3/cms-extbase: ^13.4.0
- typo3/cms-fluid: ^13.4.0
- typo3/cms-frontend: ^13.4.0
- typo3/cms-redirects: ^13.4.0
Suggests
- sgalinski/sg-account: ^9.0.0
Replaces
- sgalinski/sg_routes: 8.2.0
- dev-master
- 8.2.0
- 8.1.0
- 8.0.11
- 8.0.10
- 8.0.9
- 8.0.8
- 8.0.7
- 8.0.6
- 8.0.5
- 8.0.4
- 8.0.3
- 8.0.2
- 8.0.1
- 8.0.0
- v7.x-dev
- 7.1.3
- 7.1.2
- 7.1.1
- 7.1.0
- 7.0.8
- 7.0.7
- 7.0.6
- 7.0.5
- 7.0.4
- 7.0.3
- 7.0.2
- 7.0.1
- 7.0.0
- v6.x-dev
- 6.3.12
- 6.3.11
- 6.3.10
- 6.3.9
- 6.3.8
- 6.3.7
- 6.3.6
- 6.3.5
- 6.3.4
- 6.3.3
- 6.3.2
- 6.3.1
- 6.3.0
- 6.2.0
- 6.1.5
- 6.1.4
- 6.1.3
- 6.1.2
- 6.1.1
- 6.1.0
- 6.0.8
- 6.0.7
- 6.0.6
- 6.0.5
- 6.0.4
- 6.0.3
- 6.0.2
- 6.0.1
- 6.0.0
- v5.x-dev
- 5.0.2
- 5.0.1
- 5.0.0
- 4.2.1
- 4.2.0
- 4.1.9
- 4.1.8
- 4.1.4
- 4.1.3
- 4.1.2
- 4.1.1
- 4.1.0
- v4.0.x-dev
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.1.8
- 3.1.7
- 3.1.6
- 3.1.5
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.1
- 3.1.0
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.3.5
- 2.3.4
- 2.3.3
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.1
- 2.0.0
- 1.1.1
- 1.1.0
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
This package is not auto-updated.
Last update: 2026-03-10 15:17:54 UTC
README
License: GNU GPL, Version 2
Repository: https://gitlab.sgalinski.de/typo3/sg_routes
Please report bugs here: https://gitlab.sgalinski.de/typo3/sg_routes
Overview
With this extension you can simply create and manage URL redirects for your page and generate redirect rules for your .htaccess file.
Requirements
- TYPO3
^13.4 - PHP
8.3or8.4
Installation
Install the extension via Composer:
composer require sgalinski/sg-routes
Then install/activate the extension in TYPO3 and run database migrations in the Install Tool.
Configuration
Domain setup (required)
sg_routes is a multi-domain extension so before you use the configuration module, make sure that all the domains in your installation have correctly configured domain records for their site-root page.
You can find more information here.
Scheduler setup
Depending on traffic, route hit/log data can grow quickly. Configure TYPO3 Scheduler cleanup tasks and run them periodically.
The Backend Module
After a successful installation, you have a new module in the WEB section of your TYPO3 backend.
Clicking on it loads the administration panel. Using the drop-down above you can switch between the
Redirect Management and Redirect Log views.
The Redirect Management view
Here, all your custom URL routes are listed. The list can be filtered by Categories and search words. You can also
create, update and delete your routes and categories.
Note: To create a route/category, you need to first select a page in the page tree.
The Redirect Log view
In this view, you can find logs of when your route records were used to redirect the users of your website, and also the time it took for each redirect to execute (in seconds).
Note: Depending on how often redirects are triggered, route hit/log tables can get large. Configure scheduler cleanup tasks and make sure they are executed periodically. You can find setup details for TYPO3 scheduler cron jobs in the official documentation.
Usage
Creating a redirect rule
In your backend module, click on
the
"Create" button. Now enter from which url(Source URL) you want to redirect to (Destination URL) and whether you
want it to be a permanent (301) or a temporary redirect (302).
Example: You want to redirect temporarily from your starting page to the contact page
Source URL : /
Destination : /contact
Redirect Code: 302
Description: Here you can add a custom description for your rule, visible in the backend overview
When creating/editing a rule, you have also the option to Use regular expression. By checking this, the Source URL
is evaluated as a regular expression
and is matched against the request url. If a match is found and, the rule is applied with a rewrite based on
the Destination URL.
Example: You want to redirect permanently from your /news/... pages to /blog/...
Source URL : ^/news/(.+?)$
Destination : /blog/$1
Redirect Code: 301
Note: The rules are evaluated in the order you see them in the BE module list. Take this into account when creating
new rules, and that
you can adust the order of the rules by using the
,
,
buttons
Options for your redirect rule
After you created one or more redirect rules, you get a list overview in your backend module of all rules.
You can click on a rule to edit it or use the menu buttons:
Edit
Disable/Enable
Delete
.... Expand/Collapse the options menu
Show further information
Show history
Versioning
Create new
Move up
Move down
Copy
Cut
Paste after
Export your redirect rule(s) to your .htaccess file
It is a good practice to insert your redirect routes into your .htaccess file for better performance.
Simply click
the "
Export .htaccess" button and copy & paste the textarea content into your .htaccess file.
If all works, you can now delete your routes with
the "
Delete all" Button.
Note: Be aware that the "Export .htaccess" and "Delete all" actions respect the current filter options. Only the rules visible in the paginated list are taken into account.
Import redirects (CSV / .htaccess)
The redirect list includes an Import Redirects button (right before Export Redirects (CSV)).
Current implementation validates redirect payloads before persistence and imports them with predictable behavior:
- Supported inputs:
- CSV file upload
- CSV text paste
.htaccessfile upload.htaccesstext paste
- Input priority is top-to-bottom in the form (higher input wins, lower inputs are ignored).
- CSV supports:
- advanced header-based format (
source_path,target, optional fields) - simple 2/3-column customer CSV variants (with or without header)
- advanced header-based format (
.htaccesssupports commonRedirectand redirectingRewriteRulelines.- Validation runs before persistence and shows detailed line-level errors in the backend.
- Default behavior remains atomic (no import if errors exist), but the error result offers Ignore Errors and Import Valid Rows to skip invalid lines and import only valid rows.
- Every import run uses an automatic daily category:
- title format:
Import YYYY-MM-DD - existing category for today is reused, otherwise created automatically
- the import category is assigned to every imported redirect
- title format:
- CSV
categoriestokens are merged into the assignment:- numeric tokens are treated as category UIDs and must already exist
- existing category titles are reused
- unknown category titles are created automatically
- Input must be UTF-8 encoded (UTF-8 BOM is tolerated). Other encodings are rejected.
Testing
Run checks from the project root:
composer ecs vendor/sgalinski/sg-routes
composer phpstan vendor/sgalinski/sg-routes
composer phpunit vendor/sgalinski/sg-routes
You can also run PHPUnit directly with the extension config:
vendor/bin/phpunit -c vendor/sgalinski/sg-routes/phpunit.xml.dist
Changelog and Upgrade Notes
Breaking changes are documented in UPGRADE.md.
Developer Guide
TYPO3 Bootstrap Hook
To have the best Performance, this extension hooks into the TYPO3 bootstrap mechanism as early as possible, after the domain root-page is identified.
This is done inside the ext_localconf.php with a configuration array by supplying a path to the desired hook
function SGalinski\SgRoutes\Service\RoutingService->hook.
By extending or replacing this function, it is possible to implement more complex redirect / rewrite rules.
You can find more information on hooks in the TYPO3 Documentation.
FAQ
Why should I put my redirect rules into the .htaccess file?
You get a slightly better performance for your website by doing this.
I get the error "Too many redirects" when trying to open my website
You are most likely stuck in a redirect loop. Backup your routes by copying up your .htaccess entries and reset all your changes. Try to determine if you have created an endless loop with your routes, for instance:
/home redirects to /contact
/contact redirects to /support
/support redirects to /home