Migrating to core redirects 

Starting with TYPO3 14.2, the TYPO3 core ships a native Short URL feature built on top of EXT:redirects. This extension is therefore deprecated and will not be developed further. The tinyurls:migrate-to-redirects CLI command converts your existing tiny URL records into sys_redirect records so that you can uninstall this extension afterward.

What gets migrated 

For every tx_tinyurls_urls record found on the given storage PID, the command creates one sys_redirect record:

tx_tinyurls_urls field sys_redirect field
urlkey used to build source_path (see --url-template)
target_url target
counter hitcount
comment description
valid_until endtime

The redirect is always created with target_statuscode 301 (permanent redirect).

Records where valid_until is in the past are migrated as well, with the same (past) timestamp carried over to endtime. The resulting redirect is therefore created already expired. Nothing in tx_tinyurls_urls is deleted by this command, so it is entirely up to you whether to keep, disable or remove those expired redirects afterward.

The following records are skipped and left untouched in tx_tinyurls_urls:

  • Records with delete_on_use enabled. Redirects have no "delete after first hit" concept, so a one-time-use tiny URL would silently become a permanent redirect if it was migrated. If you still need these, note them down before migrating, since the command has no way to recreate their one-time behaviour on the redirects side.
  • Records for which a matching redirect (same --host and resulting source_path) already exists. This makes the command safe to run multiple times, for example to pick up tiny URLs that were created after an earlier migration run.

If you are not using speaking URLs 

By default, a tiny URL is accessed as index.php?eID=tx_tinyurls&tx_tinyurls[key]=<urlkey> (see What does it do?), unless you enabled Speaking URL configuration. Because of this, the command cannot derive a sensible default for --url-template when speaking URLs are disabled and requires you to pass it explicitly. The --url-template option builds a plain path (for example /<urlkey>), which matches speaking URLs but not the default eID query string. If you are not using speaking URLs, links generated by the migration will not automatically catch requests to the old eID URLs.

In that case, either keep this extension installed until you have confirmed that external links, bookmarks and search engine listings have moved over to the new redirect URLs, enable speaking URLs before migrating so that old and new URLs match, or add a webserver-level rewrite that forwards the old eID URLs to the new path, as described below.

Redirecting old eID URLs at the webserver 

If you were not using speaking URLs, you can add a rewrite rule that translates requests for the old index.php?eID=tx_tinyurls&tx_tinyurls[key]=<urlkey> URLs into the path used by --url-template, so that old links keep working without keeping this extension installed. The webserver issues a redirect to the new path, which TYPO3 then matches against the migrated sys_redirect record and redirects to the final target — one extra hop, but only for old links still in circulation.

The examples below assume the default --url-template of /tinyurl/###TINY_URL_KEY###; adjust the target path to whatever template you actually used. They also assume the default base62Dictionary (alphanumeric characters); widen the character class if you configured a custom dictionary.

Apache example configuration 

Add this to your .htaccess file or virtual host configuration (requires mod_rewrite):

RewriteEngine On
RewriteCond %{QUERY_STRING} ^eID=tx_tinyurls&tx_tinyurls\[key\]=([A-Za-z0-9-]+)$
RewriteRule ^index\.php$ /tinyurl/%1? [R=301,L]
Copied!

Nginx example configuration 

Add this inside the server block, before the location that passes requests to PHP-FPM:

if ($args ~ "^eID=tx_tinyurls&tx_tinyurls\[key\]=([A-Za-z0-9-]+)$") {
    return 301 /tinyurl/$1;
}
Copied!

Usage 

Run the command with TYPO3 Console (or via vendor/bin/typo3 on TYPO3 v10+):

vendor/bin/typo3 tinyurls:migrate-to-redirects --pid <storage-pid>
Copied!

Always do a dry run first to see how many records would be migrated (this includes already-expired tiny URLs, see What gets migrated), skipped or have already been migrated, without writing anything to the database:

vendor/bin/typo3 tinyurls:migrate-to-redirects --pid <storage-pid> --dry-run
Copied!

The command processes records in batches, so it works the same way regardless of how many tiny URLs you have.

Options 

Option Shortcut Default Description
--pid -p (required) Storage PID of the tiny URLs to migrate. This is the same PID you configured as urlRecordStoragePID (or the site's tinyurls.urlRecordStoragePID).
--target-pid 0 Storage PID for the created sys_redirect records.
--host * Value for source_host. Use * to match any host, or a specific domain if your tiny URLs are bound to one site.
--url-template derived from speakingUrlTemplate, otherwise required Template used to build source_path. ###TINY_URL_KEY### is replaced with the record's urlkey. If speaking URLs are enabled and a speakingUrlTemplate containing ###TINY_URL_KEY### is configured, this defaults to a path derived from it (with any leading host placeholder such as ###TYPO3_SITE_URL### stripped, since source_path must not contain the host). For example, the extension default ###TYPO3_SITE_URL###tinyurl/###TINY_URL_KEY### becomes /tinyurl/###TINY_URL_KEY###. If speaking URLs are disabled, or no such template is configured, there is no sensible default to guess, so the command requires you to pass this option explicitly and fails otherwise.
--dry-run off Do not write anything to the database, only report what would happen.

If your tiny URLs are spread across multiple storage pages (for example one per site), run the command once per --pid, adjusting --host and --url-template for each site as needed.