Man walking on dunes in desert © danmir12 - Fotolia.com

 SharePoint 404 Seite austauschen

SharePoint bietet über das FileNotFoundPage Property die Möglichkeit, die 404 Seite (Not Found) einer WebApplication auszutauschen. Dies ist zum Beispiel hilfreich, um eine eigene Fehlerbehandlung oder Weiterleitung zu implementieren. Durch ein Feature auf der WebApplication Ebene kann das Property im FeatureActivated Event eines FeatureEventReceivers gesetzt werden:

   
   
public override void FeatureActivated(SPFeatureReceiverProperties Properties)
{ 
    SPWebApplication webApp = Properties.Feature.Parent as SPWebApplication;
    webApp.FileNotFoundPage = "MyCustom404.html"; 
    webApp.Update();
}

Hierbei ist zu beachten, dass die Fehlerseite ausschließlich eine HTML Datei ohne ASP.NET Controls sein darf. Eine eigene Fehlerbehandlung (z.B. Logging) kann implementiert werden, indem über die HTML Seite auf eine ASP.NET Seite weitergeleitet wird. Die Standardseite (15\TEMPLATE\LAYOUTS\1033\sps404.html) macht das dann zum Beispiel so:​


   <!-- _localBinding -->
<!-- _lcid="1033" _version="" -->
<html>
<head>
           <meta HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8" />
           <meta HTTP-EQUIV="Expires" content="0" /> 
           <noscript>
                       <meta http-equiv="refresh" content="0; url=/_layouts/spsredirect.aspx?noscript=1" />
           </noscript> 
           <script language="javascript" src="/_layouts/1033/init.js"></script>
           <script language="javascript" src="/_layouts/1033/core.js"></script>
           <script language="javascript">
                       var requestedUrl = escapeProperly(window.location.href);
                       STSNavigate("/_layouts/spsredirect.aspx?oldUrl=" + requestedUrl);
           </script>
</head>
<body>
</body>
</html>​

Achtung bei Firefox & Chrome

Leider sendet SharePoint für die HTML Datei, die über diesen Weg gesendet wurde, keine Content-Type Information mit - allerdings aber ein nosniff. Internet Explorer ist dies egal: Die HTML Datei wird trotzdem analysiert, der Content-Type erkannt und die HTML Seite korrekt im Browser gerendert. Firefox versucht dies auch, scheitert allerdings in der Regel am BOM. Um dies zu verhindern ist es wichtig, die HTML Datei als UTF-8 without BOM zu speichern.

Chrome verhält sich hier leider auch sehr konform und analysiert die HTML Datei nicht. Dies führt dazu, dass die HTML Seite vom Browser nicht gerendert wird, sondern nur als Text angezeigt wird:

Chrome404.png Das Phänomen existiert schon seit SharePoint 2010. Strittig ist allerdings, ob es sich dabei um einen SharePoint Produkt Bug handelt, oder ob der Content-Type bei einem unbeabsichtigten Aufruf tatsächlich irrelevant ist.

Leider habe ich bei meinen Recherchen keine finale Lösung für Chrome gefunden, um die Fehelrseiten auf diesem Weg für alle Browser kompatibel auszutauschen. Eine Alternative wäre sicherlich ein Custom HTTPHandler, der meiner Meinung nach. aber in der heutigen "App Welt" für diese Szenario zu viel ist. Vielleicht habt ihr ja einen anderen Lösungsvorschlag :-)?

Comments