Dies ist out-of-the-box nicht möglich, da TYPO3 zu einer ungültigen URL nicht die Sprach-ID (den Sprachparameter L) geliefert bekommt und die URL auch nicht über realurl aufgelöst werden kann, da keine entsprechende Seite im System existiert.
Ein Beispiel: Es wird die URL domain.com/de/veraltete-url/ aufgerufen. Da realurl zu dieser URL keine Seite findet, steigt realurl aus und obwohl die URL den Sprachkey „de“ enthält, wird die 404 Fehlerseite anschließend in der Default-Sprache angezeigt.
Mit Ext. realurl_force404lang
Edit Nov. 2015: Leider gab es für diese Erweiterung schon lange kein Update mehr, daher funktioniert sie in neueren TYPO3- und realurl-Versionen nicht mehr.
Die Erweiterung realurl_force404lang korrigiert diesen Umstand: Sie erkennt die Sprach-ID anhand der realurl-Konfiguration aus der sprechenden URL und schreibt diesen in die GET-Superglobale. Damit wird aber noch nicht automatisch die definierte Fehlerseite (z.B. $TYPO3_CONF_VARS[‚FE‘][‚pageNotFound_handling‘] = ‚/index.php?id=71‘) in der richtigen Sprache aufgerufen, daher muss man für das 404-Handling eine User-Funktion schreiben:
LocalConfiguration.php
$TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = 'USER_FUNCTION:fileadmin/php/pageNotFoundHandling.php:user_pageNotFound->pageNotFound'; $TYPO3_CONF_VARS['FE']['pageNotFound_handling_redirectPageID'] = 71; // Attention: this parameter is not provided by TYPO3, but needed for page-not-found-userfunction |
pageNotFoundHandling.php
class user_pageNotFound { /** * Redirect to 404 error page with language-ID provided by ext. "realurl_force404lang" * * @param array $params: "currentUrl", "reasonText" and "pageAccessFailureReasons" * @param object $tsfeObj: object type "tslib_fe" */ function pageNotFound(&$params, &$tsfeObj) { // handle default language $tsfeObj->pageErrorHandler('/index.php?id=' . $GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFound_handling_redirectPageID'] . (array_key_exists('L', $_GET) ? '&L=' . $_GET['L'] : '')); } } |
Ohne Erweiterung
Ohne die Erweiterung realurl_force404lang geht es auch, so könnte die Funktion aussehen:
use TYPO3\CMS\Core\Utility\GeneralUtility; class PageNotFound { /** * Redirect to 404 error page with language-ID * * @param array $params: "currentUrl", "reasonText" and "pageAccessFailureReasons" * @param object $tsfeObj: object type "tslib_fe" */ function pageNotFoundHandling(&$params, &$tsfeObj) { // Get realurl configuration array for domain $realurlConf = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl'][GeneralUtility::getHostname()]; if(!$realurlConf) { $realurlConf = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl']['_DEFAULT']; } if(!$realurlConf) { $realurlConf = array_shift($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl']); } // Look for language configuration $language = false; foreach($realurlConf['preVars'] as $conf) { if($conf['GETvar'] == 'L') { if(is_array($conf['valueMap'])) { foreach($conf['valueMap'] as $k => $v) { // We expect a part like "/de/" in requested url if(strpos($params['currentUrl'], '/' . $k . '/') !== false) { $language = $v; break; } } } } } // Get contents of 404 page $contentUrl = GeneralUtility::locationHeaderUrl(sprintf( '/index.php?id=%u%s', $GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFound_handling_redirectPageID'], $language ? sprintf('&L=%u', $language) : '' )); $content = GeneralUtility::getUrl($contentUrl); // Output 404 page if($content) { echo $content; // No 404 page found: Display TYPO3 error page } else { $params['reasonText'] .= sprintf( ' Additionally, %s was not found while trying to retrieve the error document.', $contentUrl ); if(strpos($contentUrl, 'https://') === 0) { $params['reasonText'] .= ' Possible reason: SSL certificate is not accepted.'; } $tsfeObj->pageErrorHandler('', '', $params['reasonText']); } } } |
Danke, nach langer Suche endlich etwas, das tut.
Habe die Version ohne Erweiterung verwendet.
Danke! Endlich ein Tool für dieses Problem (ohne force404-Ext).
Leider kriege ich es nicht hin, dass er mir im „handle default language“-Fall, trotzdem die Fehlerbehandlung durchführt … er springt immer auf die Startseite der Default-Sprache (so wie es auf der eingesetzten Seite vor Einführung der 404-Version war). Hat jemand ne Idee dazu?
Viele Grüße
Joachim
Ich vergaß mitzuteilen, dass ich brutal bin und im GETvar=L – fehlt-Fall &L=1 übergebe:
// handle default language
$tsfeObj->pageErrorHandler(‚/index.php?id=‘ . $GLOBALS[‚TYPO3_CONF_VARS‘][‚FE‘][‚pageNotFound_handling_redirectPageID‘] . ‚&L=1‘);
Es lag wie immer am Problem vor dem Computer … realurl muss auch richtig konfiguriert sein:
array(
‚GETvar’=>’L‘,
‚valueDefault‘ => ‚de‘,
‚valueMap’=>array(
‚en’=>’0‘,
‚de’=>’1′,
’noMatch’=>’bypass‘,
),
),
Ich habe das noMatch-Verhalten vergessen …
@Sven Burkert: eine super Lösung, die Du ausgetüftelt hast! Funktioniert wunderbar. Danke!