Hallo zusammen,
das AMR-Plugin gibt selber keinen 404 -Header aus. Die einzige Option, die man hat, ist die Weiterleitung zur Fehlerseite, die in CONTENIDO gesetzt ist, siehe Einstellung "Bei ungültigen Artikeln zur Fehlerseite weiterleiten" im Backend.
Wenn das Plugin zur Fehlerseite weiterleitet, bringt es nichts, wenn man vorher einen "404 Not Found" Header ausgibt, da dies dann durch den folgenden Redirect ungültig wird. Danach gibt Contenido zwar einen 404 aus, was ihr wohl braucht, ist die Ausgabe des Fehlercodes 404 und der Fehlerseite, ohne eine Weiterleitung zur Fehlerseite.
Damit das Funktioniert, könnt ihr folgendes machen:
1. Die Einstellung "Bei ungültigen Artikeln zur Fehlerseite weiterleiten" des AMR-Plugins zurücksetzen, sofern es vorher aktiviert war
2. Überprüft auch den Wert in 'Prozentsatz für "ähnlich klingende" URLs'. Ist dieser niedrig, so versucht das AMR-Plugin bei falschen URLs ähnliche Seiten zu finden, wobei es hierbei den Kategoriebaum vergleicht, nicht den Artikelnamen. Setzt also diese Einstellung auf einen hohen Wert, z. B. 95 oder 100.
3. Öffnet die Datei "contenido/plugins/mod_rewrite/includes/front_content_controller.php" und ändert den Inhalt des Codeblocks, welches für die Fehlerbehandlung zuständig ist (ca. ab Zeile 40), von
Code: Alles auswählen
$iRedirToErrPage = ModRewrite::getConfig('redirect_invalid_article_to_errorsite', 0);
// try to redirect to errorpage if desired
if ($iRedirToErrPage == 1 && (int) $client > 0 && (int) $lang > 0) {
global $errsite_idcat, $errsite_idart;
if ($cfgClient['set'] != 'set') {
rereadClients();
}
// errorpage
$aParams = array (
'client' => $client, 'idcat' => $errsite_idcat[$client], 'idart' => $errsite_idart[$client],
'lang' => $lang, 'error'=> '1'
);
$errsite = 'Location: ' . Contenido_Url::getInstance()->buildRedirect($aParams);
mr_header($errsite);
exit();
}
in
Code: Alles auswählen
$iRedirToErrPage = ModRewrite::getConfig('redirect_invalid_article_to_errorsite', 0);
// try to redirect to errorpage if desired
if ($iRedirToErrPage == 1 && (int) $client > 0 && (int) $lang > 0) {
global $errsite_idcat, $errsite_idart;
if ($cfgClient['set'] != 'set') {
rereadClients();
}
// errorpage
$aParams = array (
'client' => $client, 'idcat' => $errsite_idcat[$client], 'idart' => $errsite_idart[$client],
'lang' => $lang, 'error'=> '1'
);
$errsite = 'Location: ' . Contenido_Url::getInstance()->buildRedirect($aParams);
mr_header($errsite);
exit();
} elseif ($iRedirToErrPage == 0 && (int) $client > 0 && (int) $lang > 0) {
global $errsite_idcat, $errsite_idart, $error;
if ($cfgClient['set'] != 'set') {
rereadClients();
}
$error = 1;
$idcat = $errsite_idcat[$client];
$idart = $errsite_idart[$client];
}
Somit setzt das AMR-Plugin die wichtigen 3 globalen Variablen für die korrekte Ausgabe der Fehlerseite, den Fehlerstatus ($error = 1), die Kategorie und den Artikel der Fehlerseite.
Dann gibt CONTENIDO auch einen "404 Not Found" Header mit der Fehlerseite aus.
Wichtig:
Damit das so funktioniert, muss natürlich vorher der Mandant und die Sprache korrekt ermittelt worden sein.
Wollt ihr auch eine Fehlerseite ausgeben, wenn z. B. der Mandant und/oder die Sprache nicht gefunden werden konnte, dann könnt ihr mit einer statischen Fehlerseite arbeiten.
1. Erstellt dazu einfach eine Datei 404.html im Documentroot, achtet darauf, dass der Inhalt größer als 512 Bytes ist, da ansonsten manche Browser (IE und Chrome) die Ausgabe ignorieren.
3. Erweitert das Beispiel von Oben (in Datei "contenido/plugins/mod_rewrite/includes/front_content_controller.php" um einen weiteren elseif Block:
Code: Alles auswählen
$iRedirToErrPage = ModRewrite::getConfig('redirect_invalid_article_to_errorsite', 0);
// try to redirect to errorpage if desired
if ($iRedirToErrPage == 1 && (int) $client > 0 && (int) $lang > 0) {
global $errsite_idcat, $errsite_idart;
if ($cfgClient['set'] != 'set') {
rereadClients();
}
// errorpage
$aParams = array (
'client' => $client, 'idcat' => $errsite_idcat[$client], 'idart' => $errsite_idart[$client],
'lang' => $lang, 'error'=> '1'
);
$errsite = 'Location: ' . Contenido_Url::getInstance()->buildRedirect($aParams);
mr_header($errsite);
exit();
} elseif ($iRedirToErrPage == 0 && (int) $client > 0 && (int) $lang > 0) {
global $errsite_idcat, $errsite_idart, $error;
if ($cfgClient['set'] != 'set') {
rereadClients();
}
$error = 1;
$idcat = $errsite_idcat[$client];
$idart = $errsite_idart[$client];
} elseif ($iRedirToErrPage == 0 && ((int) $client == 0 || (int) $lang == 0)) {
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
$filename = $_SERVER['DOCUMENT_ROOT'] . '/404.html';
readfile($filename);
exit();
}
Der letzte elseif Block gibt nun einen "404 Not Found" Header und den Inhalte der statischen Datei 404.html aus, sofern der Mandant oder die Sprache nicht ermittelt werden konnte.
Gruß
xmurrix