Es gibt manchmal schon lustige Zufälle: letzte Woche musste ich selbst mit dem Phänomen kämpfen und ein paar Tage später las ich dann das hier in der CakePHP Google-Group: da wunderte sich jemand, warum eine Zeile drei Mal in eine Tabelle eingefügt wird, obwohl er es doch nur einmal im Code aufruft. Die Lösung ist – überraschenderweise – meilenweit entfernt von seinem Code.

Denn im Header-Bereich seiner Seite wurde extra ein Link für ein Favicon definiert, welcher auf favicon.ico zeigt und nicht etwa /favicon.ico. Dieser kleine Unterschied hat eine große Auswirkung, denn der Browser versucht nun, in jedem Unterverzeichnis ein Favicon zu finden.

Und wenn man in CakePHP so schön mit netten URLs arbeitet (das ist keine Kritik an den Nice-URLs!), steht im Browser oft sowas hier: http://mein-cooles-projekt.de/produkte/neu/. Für den Browser ist das ein Verzeichnis und so versucht er, aus /produkte/neu/ das Favicon zu laden. Aufrgrund der Verarbeitung der Routen in CakePHP wird dabei aber erneut die Controller-Action aufgerufen, darin wieder die Seite gerendert, nochmal ein Link auf das Favicon gesetzt, usw.. Warum der Controller nun genau drei Mal aufgerufen wird, kann ich nicht genau sagen. Vielleicht ist dies dann auch nur eine Race-Condition, die eine Endlosschleife verhindert.

Beobachtet habe ich dieses Verhalten übrigens mit dem Firefox und auf die Schliche gekommen bin ich letztendlich mit der wunderbaren Erweiterung Live HTTP Headers.

Gelöst werden kann das Problem auf zwei Arten: entweder man verzichtet gänzlich auf die Favicons und löscht die entsprechende Zeile aus layout/default.html. Oder man fügt ein / vor favicon.ico ein. Dann sucht der Browser nur im Document-Root nach dem Favicon.