'TYPO3 v9 and up: How to enable disabled TYPO3 site language redirect without trailing slash

Problem

If you disable a site language of a configured TYPO3 site a redirect is automatically done to the "default" language.

I have configured two languages in my scenario (shortened site config example):

base: 'https://www.alrightsantleit.com/'
languages:
  -
    title: English
    enabled: true
    languageId: '0'
    base: /en/
    typo3Language: default
  -
    title: Deutsch
    enabled: false
    base: /de/
    typo3Language: de
    locale: de_DE.utf8
    fallbackType: strict
    fallbacks: ''
    languageId: '1'

Redirect Check

  1. curl -I https://www.alrightsantleit.com/de fails and leads into error 503
  2. curl -I https://www.alrightsantleit.com/de/ succeeds and lead to status 301 with correct redirect to https://www.alrightsantleit.com/en/

How to fix this problem?

From a technical perspective and the strict routing (since TYPO3 v9 and up) an additional redirect without trailing slash must be added manually.

But is this the right solution for such scenario?

  • Do I have to force trailing slashes in each request (e.g. by using composer package studiomitte/redirect2trailingslash) by hand?
  • Is this some missing "feature" of TYPO3 to respect also a configured base without a trailing slash?
  • Can it be completely ignored and do have internet people learn to add proper trailing slashes when typing urls or when editors of external sites links without trailing slash in their website?

How do you solve that in your project? And what's the correct way to make it error-proof?




Solution 1:[1]

A 503 and a 303 is wrong, we would need a 404 in each case. A "hidden" language is exactly like a hidden page = 404 does not exist.

Solution 2:[2]

We add two things to all our installations with TYPO3 v9 or higher:

  1. In the site configuration we add the trailing slash:
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    default: /
    index: ''
    map:
      /: 0
  1. And with the .htaccess we enforce the trailing slash for every request:
RewriteRule ^([^\.]*[^/])$ https://%{HTTP_HOST}/$1/ [L,R=301]

With that our URLs always have the trailing slash.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Benni
Solution 2 Peter Kraume