PHPackages                             georgringer/redirect-generator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PDF &amp; Document Generation](/categories/documents)
4. /
5. georgringer/redirect-generator

ActiveTypo3-cms-extension[PDF &amp; Document Generation](/categories/documents)

georgringer/redirect-generator
==============================

Generate redirect entries from a given set of URLs and export all to CSV

3.0.0(3w ago)1647.2k↓26%16[1 issues](https://github.com/georgringer/redirect_generator/issues)GPL-2.0-or-laterPHPCI passing

Since Sep 15Pushed 3w ago4 watchersCompare

[ Source](https://github.com/georgringer/redirect_generator)[ Packagist](https://packagist.org/packages/georgringer/redirect-generator)[ Docs](https://ringer.it)[ Fund](https://www.paypal.me/GeorgRinger/5)[ Patreon](https://www.patreon.com/georgringer)[ RSS](/packages/georgringer-redirect-generator/feed)WikiDiscussions master Synced today

READMEChangelog (3)Dependencies (5)Versions (8)Used By (0)

TYPO3 Extension `redirect_generator`
====================================

[](#typo3-extension-redirect_generator)

CLI tools and backend modules to bulk-import and export TYPO3 redirects from/to CSV.

Target URLs are automatically resolved to `t3://page?uid=X` links via TYPO3's routing - no manual page ID lookup needed, including error check.

Requirements
------------

[](#requirements)

- TYPO3 13.4 LTS or 14 LTS
- EXT:redirects

Installation
------------

[](#installation)

```
composer require georgringer/redirect-generator
```

Configuration
-------------

[](#configuration)

Extension configuration options (Admin → Settings → Extension Configuration):

OptionDescription`notification_email`Comma-separated list of addresses for import/export notifications`notification_level``0` = errors only · `1` = + warnings · `2` = + info`allow_empty_import_file`If true, an empty CSV file silently skips the import instead of throwing an errorCLI Commands
------------

[](#cli-commands)

### Add a single redirect

[](#add-a-single-redirect)

```
./bin/typo3 redirect:add   [--status-code=307] [--dry-run]
```

The target must be a full URL of a page on this TYPO3 instance. It is resolved to the corresponding page ID automatically.

```
./bin/typo3 redirect:add /old-path https://example.com/new-page --status-code=301
```

### Import redirects from CSV

[](#import-redirects-from-csv)

```
./bin/typo3 redirect:import  [--dry-run] [--external-domains=domain1,domain2] [--delete-file]
```

**CSV format** — semicolon-delimited, first row must be the header:

```
source;target;status_code;external
/old-page;https://example.com/new-page;301;0
/old-section/article;https://example.com/news/article;307;0
/external-link;https://other-domain.com/page;301;1
```

ColumnRequiredDescription`source`yesSource path (e.g. `/old-page`)`target`yesFull target URL. Internal pages are resolved to `t3://page?uid=X`. Set `external=1` to skip resolution.`status_code`noHTTP status code. Falls back to `307` if omitted or invalid.`external`no`1` = store target URL as-is without page lookupSet a target value of `x` to skip a row.

Options:

OptionDescription`--dry-run`Simulate import without writing to the database`--delimiter`CSV delimiter: `;` (default), `,` or `tab``--external-domains`Comma-separated list of domains always treated as external`--delete-file`Delete the CSV file after import> This command is schedulable (TYPO3 Scheduler → *Execute console commands*).

### Export redirects to CSV

[](#export-redirects-to-csv)

```
./bin/typo3 redirect:export  [--transform-target-url]
```

`--transform-target-url` resolves stored `t3://page?uid=X` links back to readable URLs.

> This command is schedulable.

Backend UI — `redirect_generator_ui`
------------------------------------

[](#backend-ui--redirect_generator_ui)

The companion extension **`georgringer/redirect-generator-ui`** adds a full backend module under *Link Management* with import and export forms — no CLI access required.

More information: [ringer.it/extensions/redirect-generator-ui](https://ringer.it/extensions/redirect-generator-ui/)

```
composer require georgringer/redirect-generator-ui
```

   [![Link Management module](Resources/Public/Screenshots/ui/module-link-management.png)](Resources/Public/Screenshots/ui/module-link-management.png)
 Module in the backend navigation   [![Export module](Resources/Public/Screenshots/ui/export.png)](Resources/Public/Screenshots/ui/export.png)
 Export — filter by type, resolve target URLs     [![Import success](Resources/Public/Screenshots/ui/import-success.png)](Resources/Public/Screenshots/ui/import-success.png)
 Import — live result with per-row feedback   [![Import errors](Resources/Public/Screenshots/ui/import-error.png)](Resources/Public/Screenshots/ui/import-error.png)
 Import — conflicts and errors shown inline  **Features:**

- Paste CSV directly into a textarea — no file upload or server access needed
- Choose delimiter (`;` `,` `tab`) and default status code per import run
- Dry-run mode to preview results before writing
- Per-row result feedback: imported, skipped, conflicting duplicates, errors
- Export with optional filter by redirect type or creation type
- Resolve stored `t3://page` links to readable URLs on export

PSR-14 Events
-------------

[](#psr-14-events)

Two events are dispatched from `RedirectRepository::addRedirect()` (not fired during dry runs):

### `BeforeRedirectAddedEvent`

[](#beforeredirectaddedevent)

Fired just before the database insert. Listeners may modify source URL, target URL, or the `Configuration` object.

```
use GeorgRinger\RedirectGenerator\Event\BeforeRedirectAddedEvent;

class MyListener
{
    public function __invoke(BeforeRedirectAddedEvent $event): void
    {
        // Force all new redirects to 301
        $event->setConfiguration(
            new Configuration(targetStatusCode: 301)
        );
    }
}
```

### `AfterRedirectAddedEvent`

[](#afterredirectaddedevent)

Fired after the insert. Provides `sourceUrl`, `targetUrl`, `configuration`, and the new `uid`.

```
use GeorgRinger\RedirectGenerator\Event\AfterRedirectAddedEvent;

class MyListener
{
    public function __invoke(AfterRedirectAddedEvent $event): void
    {
        // e.g. flush a custom cache, send a webhook, ...
    }
}
```

Register listeners in your extension's `Services.yaml`:

###  Health Score

57

—

FairBetter than 98% of packages

Maintenance94

Actively maintained with recent releases

Popularity40

Moderate usage in the ecosystem

Community20

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 54.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~492 days

Recently: every ~541 days

Total

6

Last Release

23d ago

Major Versions

0.3.0 → 1.0.02022-11-30

1.0.0 → 3.x-dev2026-06-11

### Community

Maintainers

![](https://www.gravatar.com/avatar/1d08c176686c8914d32c70d4af388887d738930fdfdf07c7ca9c841ad10ed683?d=identicon)[georgringer](/maintainers/georgringer)

---

Top Contributors

[![georgringer](https://avatars.githubusercontent.com/u/1905663?v=4)](https://github.com/georgringer "georgringer (44 commits)")[![rk-mxp](https://avatars.githubusercontent.com/u/35734421?v=4)](https://github.com/rk-mxp "rk-mxp (25 commits)")[![ayacoo](https://avatars.githubusercontent.com/u/5963331?v=4)](https://github.com/ayacoo "ayacoo (4 commits)")[![jonasteich](https://avatars.githubusercontent.com/u/84093613?v=4)](https://github.com/jonasteich "jonasteich (3 commits)")[![arbonia-koehnlein](https://avatars.githubusercontent.com/u/235669314?v=4)](https://github.com/arbonia-koehnlein "arbonia-koehnlein (2 commits)")[![koehnlein](https://avatars.githubusercontent.com/u/16088567?v=4)](https://github.com/koehnlein "koehnlein (1 commits)")[![mikestreety](https://avatars.githubusercontent.com/u/354085?v=4)](https://github.com/mikestreety "mikestreety (1 commits)")[![BastiLu](https://avatars.githubusercontent.com/u/89908559?v=4)](https://github.com/BastiLu "BastiLu (1 commits)")

---

Tags

exportcsvimportextensionredirecttypo3

### Embed Badge

![Health badge](/badges/georgringer-redirect-generator/health.svg)

```
[![Health](https://phpackages.com/badges/georgringer-redirect-generator/health.svg)](https://phpackages.com/packages/georgringer-redirect-generator)
```

###  Alternatives

[wazum/sluggi

TYPO3 extension for URL slug management with inline editing, auto-sync, locking, access control, and redirects

40529.5k](/packages/wazum-sluggi)[highsolutions/laravel-lang-import-export

A Laravel package providing artisan commands to import and export language files from and to CSV.

24315.3k](/packages/highsolutions-laravel-lang-import-export)[avro/csv-bundle

Symfony2 CSV Bundle

3040.5k1](/packages/avro-csv-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
