Verbesserung 404 Page not found

Hi zusammen,

ich möchte gerne die 404 Fehlerseite vom Oxid Shop CE verbessern. Momentan wird nur der Text “Page not found” ausgegeben, wenn man eine nicht vorhandene Shop URL angibt, z.B. http://demoshop.oxid-esales.com/community-edition/sfdsdfsdfsfd/

Mit Konfiguration im Apache (Stichwort User Defined Error Documents) hat es nicht geklappt, ich nehme an weil nicht der Server den 404 wirft sondern er vom Oxid Shop generiert wird.

Daher habe ich es momentan folgendermaßen implementiert:
[ol]
[li] Eigene View Seite/Klasse “error404.php” auf Grundlage der start.php[/li]

[li] Eigenes Template error404.tpl auf Grundlage der start.tpl
[/li] [ul]
[li] Template verweist auf eine CMS Seite auf der der “Seite nicht gefunden” Text konfiguriert werden kann[/ul][/li]

[li] Anpassung der core/oxfunctions.php
[/li] [ul]
[li] Anstatt 404 (Not found) einen 301 (Moved Permanently) Header und Weiterleitung zur neuen 404-Fehlerseite[/ul][/ol][/li]

Ergebnis: Der Kunde bleibt innerhalb des Shop Designs und bekommt eine nett formatierte, hilfreiche Fehlermeldung, dass die von ihm gewünschte Seite nicht existiert.

Nun zu meinen Fragen:
[ol]
[li] Ist dieser Lösungsansatz sinnvoll?
[/li] [ul]
[li] Falls nein, wie kann man es besser machen?[/ul][/li]

[li] Ergeben sich Probleme durch eine Weiterleitung (301) auf eine Fehlerseite mit 404?
[/li] [ul]
[li] z.B. hinsichtlich Suchmaschinen-Crawler/SEO[/ul][/ol][/li]

Bin gespannt auf Eure Rückmeldungen und Meinungen,

mbierkandt

Hallo mbierkandt,

auf alle Fälle ist dieses Thema spannend!

Es gibt bei Google Webmaster Tools m. E. Direktiven für optimierte 404-Seiten. Ob eine Weiterleitung per 301 auf 404 Sinn macht, kann ich nicht genau sagen.

Gruß


Marco Steinhäuser
Community Guide
OXID eSales AG

Also ich glaube auch nicht das eine umleitung per 301 sinn macht und weis ehrlich gesagt auch nicht, wie google das so annimmt.

Zu dem Thema error-sites, warum kompliziert machen wenn`s auch einfach geht? Jedenfalls ich würde definitiv dafür kein Modul oder sowas machen, weil man soetwas auch einfach per htaccess lösen kann zb so hier:

ErrorDocument 404 http://www.meineseite.de/my404.html
ErrorDocument 401 http://www.meineseite.de/my401.html
ErrorDocument 500 http://www.meineseite.de/my500.html

Das sind ja die gängisten http-error-codes und werden beim auftreten einfach umgeleitet zu einer eigenen 404 seite

Danke für den Input bisher!

@exo: Ich habe das über die .htaccess ausprobiert - leider funktioniert das (bei mir?) nicht.

Ich vermute das Problem ist, dass my404.html nur angezogen wird, wenn der Server physikalisch eine Seite nicht findet. Im Falle von Oxid, wird die Seite jedoch gefunden und dann wird dynamisch per PHP einen 404 Header erzeugt, d.h. die eigene 404 Fehlerseite wird nicht angezogen.

Oder hat hier jemand andere Erfahrungen und ErrorDocument funktioniert zusammen mit Oxid CE?

Also Google behandelt es wohl als Umleitungsfehler, d.h. Google denkt es soll einen Redirect geben, erkennt aber dass der Redirect falsch ist und daher einen 404 produziert.

Zumindest taucht es so in meinen Statistiken auf…

Hi!

Habe gestern Abend meinen OXID eShop in Betrieb genommen (nach Migration von XTC) und stand vor genau demselben Problem. Ich habe jetzt erstmal (quick & dirty) die core/oxfunctions.php gehackt, so dass sie bestimmte URLs aus dem alten XTC Shop abfängt, daraus einen Suchstring generiert und dann mittels 301 an die Such-URL des OXID Shops weiterleitet. So hat der Besucher wenigstens die Chance, das gesuchte in den Suchergebnissen zu finden.

Wäre doch auch ein interessanter Ansatz für Deine Klasse (die ich im Übrigen gerne auch ausprobieren würde) … Statt nur einer nett formatierten Meldung eine (sinnvolle) Weiterleitung auf die Suchseite.

LG
Carsten

Klingt auch nach einer guten Idee. Allerdings bin ich mir in meinem Fall unschlüssig, ob die Generierung eines sinnvollen Suchstrings machbar ist.

Und werden die Benutzer informiert, dass die gesuchte Seite nicht vorhanden ist?


Anderer technischer Ansatz wäre noch die Anpassung der oxcurefunctions.php in der Form, dass sie direkt ein Template mit dem 404 Header und einem Hinweis lädt. Weiß jemand, wie man da Vorgehen müsste, damit man von dort ein Template laden und anzeigen kann?


@sannc: Meine Anpassungen gebe ich gerne weiter - wie kann ich denn Dateien hier bereitstellen bzw. sie Dir zukommen lassen?

Hi!

Das mit dem Suchstring muss man halt sehen … man kann ja die URL auseinandernehmen … die OXID Suche funktioniert ja mit ODER Verknüpfungen so dass der Besucher eher zuviel als zuwenig Ergebnisse bekommt.

Für die Dateien wäre ich sehr dankbar. Schick sie einfach an infoXessenzenladenYde.

Danke :slight_smile:
Carsten

@sannc: Sind die Dateien angekommen?

@mbierkandt: Yep. Schaue sie mir an, sobald ich dazu komme. Momentan ist ein bisschen dicke.

Ich würde es gerne mal ausprobieren, selber ein Template (aus der oxfunctions.php heraus) zu laden, um eine Fehlermeldung anzuzeigen.

Weiß jemand, wie der PHP Code aussieht, um ein bestimmtes Template zu laden und anzuzeigen?

Oxid CE 4.0.1.0 (Rev. 15990)

Danke für den Hinweis!

Du meinst der error 404 Handler wird immer aufgerufen, auch wenn nur Elemente einer Seite nicht gefunden werden?

Irgendwas hilfreicheres als nur der Text “Page not found” (und sonst nichts - Beispiel) und einigermaßen im Shop-Design muss doch möglich sein, schließlich muss man dem Anwender doch eine Hilfestellung geben können, wie er doch noch zum Ziel kommt.

Und ich dachte an ein Template, weil damit Shop-Admins den angezeigten Fehlertext entsprechend im Backend beeinflußen könnten.

Nur wie…?

:?

Oxid CE 4.0.1.0 (Rev. 15990)

Eigenes Template error404.tpl auf Grundlage der start.tpl

[ul]
[li] Template verweist auf eine CMS Seite auf der der “Seite nicht gefunden” Text konfiguriert werden kann[/ul][/li]

Problem bei der Sache. Die 404 Seiten werden immer im Hintergrund geladen wenn ein Objekt nicht gefunden wird. Dies betrifft auch fehlende Grafiken, CSS-Dateien, Javascripte etc…

Das wird vor allem dann zum Problem, wenn die 404 Seite per Skript erzeugt wird. Wenn du dann auf eine Seite gehst die darstellbar ist aber z.B. 4 Objekte hat die nicht vorhanden sind, dann sind das im Endeffekt 5 Aufrufe eines php-Skriptes.

In meinen Augen sind angepasste 404 Seiten mit Vorsicht zu genießen und es ist fraglich ob dadurch dann immer eine Verbesserung erzielt wird.

P.S.: Wir kommen auch von xt. Wir haben die alten Produktlinks per Rewrite Rules in der .htaccess auf die neuen Links umgeleitet

LG Carolin

Hallo zusammen,

je nach Provider kann man doch eigene Error-Seiten anlegen, diese werden in der htaccess eingetragen.

Diese Seiten lassen sich dann individuell gestalten.

Beste Grüße ecombiz

@ecombiz: Funktioniert das mit der .htaccess bei Dir im Zusammenhang mit Oxid?

Bei mir tut es nämlich nicht (siehe oben) und es wäre interessant zu wissen, ob es wirklich mit Oxid bei anderen geht.

Oxid CE 4.0.1.0 (Rev. 15990)

Hallo mbierkandt,

habe ich noch nicht getestet, da ich im Moments nichts zum Umleiten habe…

Beste Grüße ecombiz

Ich hab mich grad nochmal in die google webmaster tools verbissen. Unter > Tools > 404-Seiten verbessern gibts ein schickes JS zum Einbinden. Was haltet Ihr davon?

Gruß


Marco Steinhäuser
Community Guide
OXID eSales AG

Sofern das nur aufgerufen wird wenn eine html-Seite nicht gefunden wird und nicht auch wenn ein Javascript, Image oder sonstwas nicht gefunden werden kann, sicherlich nicht die schlechteste Lösung.

Aber momentan bei Google noch in der Testphase.

Hi,

OXID hat hier schon direkt das Handling vorgesehen und der shop übernimmt dadd, deswegen greift das über htaccess nicht.

Im File modules/functions.php braucht man einfach nur den den error handler einzusetzen.

Die software prüft auf

( !function_exists( ‘error_404_handler’ )

und die verarbeitenden Files nutzen auch brav “error_404_handler()” wenn was nicht verfügbar ist.

Hier meine Lösung

Fehler abfangen und zu einem eigenen tpl-fiel weiterleiten. Bei Mir ist das eine angepasste Kopie des search.tpl

ACHTUNG: ich habe noch ein “slash-Problem” das funktioniert noch nicht richtig den “nichgefunden” String als Suche auszuführen, bin für Hinweise dankbar!

In modules/functions.php einfügen


/**
* catch not found arguments and pass them to custom search template as custom 404 page
*/
function error_404_handler( $args )
{
	#$args =  stripslashes( htmlentities( $args ) ); 
	#$args = str_replace("/", "", $args);
	header("Location: http://localhost/ce401/index.php?cl=search&searchparam=$args&tpl=404-search.tpl");
	exit();
}

Kopie von search.tpl > 404-search.tpl

[smarty]
[{assign var=“search_title” value=“SEARCH_TITLE”|oxmultilangassign}]
[{assign var=“template_title” value="$search_title - $searchparamforhtml"}]

[{include file="_header.tpl" title=$template_title location=“SEARCH_LOCATION”|oxmultilangassign }]
[{assign var=“pageNavigation” value=$oView->getPageNavigation() }]

			404  - Page not found	
	
	Your requsted page was not found
	Some more text for customer here, you may implement google ajax search here.
	Post some categorie links here, implement cms page content here...		

[{if $pageNavigation->iArtCnt }]

	Your requsted page has not been found, here are some serch results which my be useful for you.	
	


[{include file="inc/list_locator.tpl" PageLoc="Top"}]

[{else}]
[{*
DONT SHOW 404 SEARCH WITH NO RESULTS TO CUSTOMER
[{ oxmultilang ident=“SEARCH_NOITEMSFOUND” }]
*}]
[{/if}]

[{if $oView->getArticleList() }]
[{assign var=“search_head” value=“SEARCH_HITSFOR”|oxmultilangassign}]
[{assign var=“search_head” value=$pageNavigation->iArtCnt|cat:" “|cat:$search_head|cat:” “”|cat:$oView->getSearchParamForHtml()|cat:"""}]

[{if $rsslinks.searchArticles}]
    [{assign var="search_head" value="`$search_head` \"`$rsslinks.searchArticles.link`\""}]
    [{oxscript add="oxid.blank('rss.searchArticles');"}]
[{/if}]

[{foreach from=$oView->getArticleList() name=search item=product}]

  [{if $smarty.foreach.search.first && !$smarty.foreach.search.last}]
    [{assign var="search_class" value="firstinlist"}]
  [{elseif $smarty.foreach.search.last}]
    [{assign var="search_class" value="lastinlist"}]
  [{else}]
    [{assign var="search_class" value="inlist"}]
  [{/if}]

  [{include file="inc/product.tpl" product=$product size="thin" head=$search_head class=$search_class testid="Search_"|cat:$product->oxarticles__oxid->value test_Cntr=$smarty.foreach.search.iteration}]

  [{assign var="search_head" value=""}]
  [{if !$smarty.foreach.search.last }]
    
  [{/if}]

[{/foreach}]

[{/if}]

[{if $pageNavigation->iArtCnt }]
[{include file=“inc/list_locator.tpl” PageLoc=“Bottom”}]
[{/if}]

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

[/smarty]

Wie gesagt, ich habe da noch ein slash problem, zum testen auf einer Standardinstallation wie es funktionieren soll:
http://localhost/ce401/index.php?cl=search&searchparam=uhr&tpl=404-search.tpl

Viele Grüße
Magnus

Hi,

mein code was ich oben gepostet habe functions.php, das schein nun doch zu klappen auch das mit dem slash, einfach die 2 Rauten raus nehmen :slight_smile:

…ich hatte gerade versucht in der .htaccess noch einen Eintrag zu ändern um en zusätzlichen slash zu vermeien:

Ziele 13

[apache]RewriteRule !(.html|/|.jpg|.css|.pdf|.doc|.gif|.png|.js)$ %{REQUEST_URI}/ [R=301,L][/apache]
ersetzen durch

[apache]RewriteRule !(.html|/|.jpg|.css|.pdf|.doc|.gif|.png|.js|.tpl)$ %{REQUEST_URI}/ [R=301,L][/apache]

Viele Grüße
Magnus