Eigene 404 Seite klappt nicht

Hallo zusammen,

ich habe Probleme beim Einrichten einer eigenen 404-Seite.

Im CMS habe ich eine eigene 404-Seite gebaut, die auch funktioniert, wenn man sie direkt über die Adresszeile aufruft (www.domainname.de/Content-not-found-Error-404/).

Danach habe ich in der .htaccess-Datei auf der root-Ebene ganz unten eingefügt:
ErrorDocument 404 /Content-not-found-Error-404/

Trotzdem erscheint bei nicht existierenden URL immer wieder nur das nackte “Page not found” anstelle der 404-Seite.
Habe ich ein Brett vorm Kopf oder muss man da bei Oxid noch irgendwo was einstellen?

Danke!
Gruß
floko

Hast du es schon mal mit dem absoluten Pfad versucht?

Ja, direkt nachdem ich Deinen Beitrag gelesen habe :slight_smile:
Also: ErrorDocument 404 http://www.domainname.de/Content-not-found-Error-404/
Klappt leider auch nicht.

Hi,

schau mal hier: http://www.oxid-esales.com/forum/showthread.php?t=695&highlight=Verbesserung+Page+-found&page=2#post4194

  • einfache Lösung:

http://www.oxid-esales.com/forum/showthread.php?t=695&highlight=Verbesserung+Page+-found&page=3#post4198

Die Lösungen basieren auf Anpassungen im File modules/functions.php.

Sieht vielversprechend aus. Ich probier das gleich mal…
Danke für den Tipp!

Perfekt! Die Funktion error_404_handler() in modules/functions.php packen, eigene Ziel-URL einstellen und fertig.
Vielen Dank!

Kleiner Nachtrag für die SEO: Damit Suchmaschinen auch wissen, dass die Zielseite nicht mehr existiert, sollte man vielleicht erst den 404 header schicken und darunter die Zielseite ohne eine Weiterleitung anzeigen.
(Siehe auch http://www.oxid-esales.com/forum/showthread.php?p=12498#32)
Andernfalls “sieht” der Crawler jede Menge Duplicate Content, da alle verschwundenen und falsch verlinkten Seiten nach dem Redirect denselben Inhalt haben.

Hm, ich weiß jetzt nicht genau was Du meinst:

Meine function.php

function error_404_handler( $args )
{
        $args =  stripslashes( htmlentities( $args ) );
        $args = str_replace("/", "", $args);
        header("Location: http://www.domain.tld/index.php?cl=info&tpl=404.tpl");

        exit();
}

Als CMS-Seite habe ich nun eine seite mit Ident error404 als Snippet angelegt. Dort wird auch der angezeigte “Fehlertext” hinterlegt.

in out/basic/tpl zwei .tpl - Files angelegt:

404.tpl:

[{assign var="template_title" value="Error 404"}]
[{include file="404_header.tpl" title=$template_title location=$template_title}]
<strong class="boxhead">Error 404 - Seite nicht gefunden</strong>

<div class="msg">
              
[{ oxcontent ident="error404" }]              
              
              
        </div>

[{ insert name="oxid_tracker" title=$template_title }]
[{include file="_footer.tpl"}]

404_header.tpl:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html[{if $oView->getActiveLangAbbr()}] lang="[{ $oView->getActiveLangAbbr() }]"[{/if}]>
<head>
    [{assign var="_titlesuffix" value=$_titlesuffix|default:$oView->getTitleSuffix()}]
    [{assign var="title" value=$title|default:$oView->getTitle() }]
    <title>[{$oxcmp_shop->oxshops__oxtitleprefix->value}][{if $title}] | [{$title|strip_tags}][{/if}][{if $_titlesuffix}] | [{$_titlesuffix}][{/if}]</title>
    <meta http-equiv="Content-Type" content="text/html; charset=[{$charset}]">
    [{if $oView->noIndex() == 1 }]
    <meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
    [{elseif $oView->noIndex() == 2 }]
    <meta name="ROBOTS" content="NOINDEX, FOLLOW">
    [{/if}]
    [{if $oView->getMetaDescription()}]<meta name="description" content="[{$oView->getMetaDescription()}]">[{/if}]
    [{if $oView->getMetaKeywords()}]<meta name="keywords" content="[{$oView->getMetaKeywords()}]">[{/if}]
    <link rel="shortcut icon" href="[{ $oViewConf->getBaseDir() }]favicon.ico">
	<link rel="stylesheet" type="text/css" href="[{ $oViewConf->getResourceUrl() }]zusatz.css">
    <link rel="stylesheet" type="text/css" href="[{ $oViewConf->getResourceUrl() }]oxid.css">
    <!--[if lt IE 8]><link rel="stylesheet" type="text/css" href="[{ $oViewConf->getResourceUrl() }]oxidbc.css"><![endif]-->

    [{if $rsslinks}]
      [{foreach from=$rsslinks item='rssentry'}]
        <link rel="alternate" type="application/rss+xml" title="[{$rssentry.title|strip_tags}]" href="[{$rssentry.link}]">
      [{/foreach}]
    [{/if}]
</head>
<body>
[{php}]
header("HTTP/1.0 404 Not Found");
[{/php}]
<div id="page">

    <div id="header">
        <div class="bar oxid">
            <a class="logo" href="[{ $oViewConf->getBaseDir() }]">
                <img src="[{$oViewConf->getImageUrl()}]logo.png" alt="[{$oxcmp_shop->oxshops__oxtitleprefix->value}]">
            </a>

            [{if $oView->showTopBasket()}]
                [{oxid_include_dynamic file="dyn/top_basket.tpl" type="basket"}]
            [{/if}]

Damit wird mir folgendes als Resultcode im Header ausgeliefert:


URL=http://www.domain.tld/test.html
Result code: 302 (Found / Moved Temporarily)
New location: http://www.domain.tld/index.php?cl=info&tpl=404.tpl

URL=http://www.domain.tld/index.php?cl=info&tpl=404.tpl
Result code: 404 (NotFound / Not Found)

Da ist nix mit DC usw.

Vorneweg: Ich hab nur die Schmalspurvariante gebaut; alle User kommen auf eine einzige 404-Seite, die ich im CMS für die Default-Sprache Englisch angelegt habe. Den Umweg über ein separates Template gehe ich also gar nicht.

Wenn am Ende bei Deiner Variante ein 404 dabei herauskommt, funktioniert das wahrscheinlich auch aus SEO-Sicht gut. (Ich weiss jetzt zwar nicht, wie der Google-Bot es bewertet, wenn er vor dem 404 nochmal umgeleitet wird…)

Auf Duplicate Content kommst Du nur, wenn es bei der Umleitung bleibt und kein 404 geschickt wird: Hunderte kaputter/veralteter Links verweisen dann (nach dem Redirect) auf eine einzige Sammelseite. Da sehe ich aber auch kein Problem bei Dir.

Ja, sehe ich auch so. Der Redicrect vor dem 404 ist zwar meiner Meinung nach überflüssig, stört aber auch nicht und Google was egal. Die alten Shopseiten mit PR bzw. gutem Index sollte man eh nicht auf den 404er laufen lassen sondern mit Redirect auf die neuen Seiten. Ich fand die “große” Lösung ideal, weil man hier auch wunderbar dem Besucher noch Infos liefer kann mit direkter Editierbarkeit im Content Manager. Ausserdem bleibt das Shopdesign durchgängig erhalten.

[QUOTE=Christian76;12527]weil man hier auch wunderbar dem Besucher noch Infos liefer kann mit direkter Editierbarkeit im Content Manager. Ausserdem bleibt das Shopdesign durchgängig erhalten.[/QUOTE]

Mmh. Für beides, also durchgängiges Shopdesign und Editierbarkeit im CMS, brauchst Du aber doch kein eigenes Template…? :confused:
Ich hab z.B. meine 404-Seite im CMS angelegt mit ein bißchen erklärendem Text, Link auf die Shopsuche und auf die Homepage. Dann bekam das Ganze eine fixe URL, die ich dann als Ziel in das 404-Skript eingebaut habe. Angezeigt wird die Seite dann natürlich im Standard-Template des Shops.

Gruß
floko

Hi,

wir bringst Du dann die

[{php}]
header("HTTP/1.0 404 Not Found");
[{/php}]

bei der Fehlerseite unter. Genau dies ist doch das Problem und daher ein eigenes Template, da dort die Headeranweisung eingebaut ist.

Den 404-Header schicke ich direkt in der 404-Funktion ab, anstelle einer Weiterleitung binde ich dann die Zielseite darunter ein:

function error_404_handler( $args )
{
header(‘HTTP/1.1 404 NOT FOUND’);
echo file_get_contents(‘http://www.domainname.de/Content-not-found-Error-404/’);
exit();
}

Das scheint auch bestens zu funktionieren. Oder habe ich da irgendwas übersehen?

Gute Frage :-). Die Umsetzung ist bei mir schon einige Monate her. Ich werde mir mal die “kleine” Lösung anschauen und vergleichen. Wäre ja um einiges einfacher :slight_smile: