Migrating to core redirects
Starting with TYPO3 14.2, the TYPO3 core ships a native
Short URL feature
built on top of EXT:. This extension is therefore deprecated and will not
be developed further. The tinyurls: CLI command converts your
existing tiny URL records into sys_ records so that you can uninstall this
extension afterward.
What gets migrated
For every tx_ record found on the given storage PID, the command creates
one sys_ record:
| tx_tinyurls_urls field | sys_redirect field |
|---|---|
urlkey | used to build source_ (see --) |
target_ | target |
counter | hitcount |
comment | description |
valid_ | endtime |
The redirect is always created with target_ 301 (permanent redirect).
Records where valid_ 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_ 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_:
- Records with
delete_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.on_ use - Records for which a matching redirect (same
--and resultinghost source_) 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.path
If you are not using speaking URLs
By default, a tiny URL is accessed as
index. (see What does it do?), unless
you enabled Speaking URL configuration. Because of this, the command cannot derive
a sensible default for -- when speaking URLs are disabled and requires you
to pass it explicitly. The -- 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. URLs into the path used by
--, 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_ record and redirects to the final target — one extra hop,
but only for old links still in circulation.
The examples below assume the default -- of
/tinyurl/###TINY_; 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_):
RewriteEngine On
RewriteCond %{QUERY_STRING} ^eID=tx_tinyurls&tx_tinyurls\[key\]=([A-Za-z0-9-]+)$
RewriteRule ^index\.php$ /tinyurl/%1? [R=301,L]
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;
}
Usage
Run the command with TYPO3 Console
(or via vendor/ on TYPO3 v10+):
vendor/bin/typo3 tinyurls:migrate-to-redirects --pid <storage-pid>
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
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 |
|---|---|---|---|
-- | -p | (required) | Storage PID of the tiny URLs to migrate. This is the same PID you configured as
url (or the site's tinyurls.). |
-- | — | 0 | Storage PID for the created sys_ records. |
-- | — | * | Value for source_. Use * to match any host, or a specific domain
if your tiny URLs are bound to one site. |
-- | — | derived from speaking, otherwise required | Template used to build source_. ###TINY_ is replaced
with the record's urlkey. If speaking URLs are enabled and a
speaking containing ###TINY_ is configured, this
defaults to a path derived from it (with any leading host placeholder such as
###TYPO3_ stripped, since source_ must not contain the
host). For example, the extension default
###TYPO3_ becomes
/tinyurl/###TINY_. 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. |
-- | — | 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 --, adjusting -- and -- for each
site as needed.
Recommended workflow
- Update to the latest release of this extension and make sure
EXT:is active.redirects - Run the command with
--and check the summary output.dry- run - Run it for real, with
--andhost --matching your setup.url- template - Check the created records in the backend Redirects module.
- If you were not using speaking URLs, add the webserver rewrite described in Redirecting old eID URLs at the webserver so that old links keep working.
- Test a handful of migrated tiny URLs in the browser to confirm they now go through
sys_.redirect - Review the migrated redirects that are already expired (see What gets migrated) and decide whether to keep, disable or delete them.
- Repeat for every storage PID that contains tiny URL records.
- Once you are confident all relevant links have been migrated, remove this extension and
drop the
tx_table.tinyurls_ urls