Seltsamer Fehler: Login geht nicht

Ich bin heute im englischen Support-Forum auf ein sehr ungewöhnliches Problem gestoßen, das in dieser Form nicht nur bei bbPress auftreten kann, sondern auch bei anderen in PHP programmierten Webanwendungen, die ihre Konfiguration in einer PHP-Datei vorhalten. Insbesondere kann es auch bei WordPress auftreten. Es ist eines dieser Probleme, die von einem normalen Menschen nicht leicht verstanden werden, und das Verhalten der Anwendung ist verwirrend, so dass leicht ein völlig anderer Fehler vermutet wird.

Ich werde hier allerdings beschreiben, wie es sich im konkreten Fall bei einer frischen Installation von bbPress geäußert hat.

Symptom

Ein bbPress-Forum wurde neu aufgesetzt. Die Installation verlief völlig reibungslos. Da das Forum mit einem laufenden WordPress integriert werden sollte, wurden nachträglich noch die Geheimschlüssel für die Cookies auf sichere Werte gesetzt, die in bbPress und WordPress übereinstimmend eingetragen wurden.

Dabei wurde die Datei bb-config.php mit einem Editor bearbeitet, um die Werte für BB_AUTH_KEY und die anderen Werte nachträglich in die Konfiguration einzutragen, die so bearbeitete Datei wurde zum Server hochgeladen.

Das Forum schien zu funktionieren, aber es war kein Login mehr möglich.

Beim Versuch des Einloggens erschienen eine Reihe von Fehlermeldungen der „Bauweise“ Warning: Cannot modify header information - headers already sent by (output started at /xxx/xxx/xxx/forum/bb-config.php:1) in /xxx/xxx/xxx/forum/bb-includes/functions.bb-pluggable.php on line 232 (den originalen Pfad habe ich hier natürlich geändert).

Ein Login war nicht mehr möglich. Auch ein frisch registrierter Benutzer – es war immer noch möglich, eine Registrierung durchzuführen, und auch die Mail mit dem Passwort wurde versendet – konnte sich nicht einloggen.

Das Ergebnis war ein unbrauchbares Forum… immerhin, es macht keinen administrativen Aufwand mehr. ;-)

Rätselraten

Wenn man vor einem derart unverständlichen Fehler steht, vermutet man natürlich die Fehlerquelle Nummer Eins, die Integration von bbPress in WordPress. Mit dieser naheliegenden Vermutung ist das Problem auch im Support-Forum aufgetaucht, und so bin schließlich auc ich darauf gestoßen und habe mich damit ein wenig auseinandergesetzt.

Dabei ist mir nach sehr kurzem Nachdenken aufgefallen, dass es sich nicht um eines dieser Integrationsprobleme handeln kann.

Die Fehlermeldung entsteht, weil bbPress nach der Anmeldung ein Cookie zu setzen versucht, um den angemeldeten Benutzer zu identifizieren. Diese geschieht im HTTP-Header, also noch bevor ein wirklicher Inhalt an den Browser gesendet wird – und nach der Übertragung des ersten Zeichens des Inhaltes ist es nicht mehr möglich.

Mit diesem Hintergrundwissen ist klar, wie die Fehlermeldung zu verstehen ist. PHP konnte keinen HTTP-Header mehr setzen, um das Cookie mit der Identifikation des angemeldeten Benutzers zu setzen, weil es vorher zu einer Textausgabe gekommen war, und dies geschah laut Fehlermeldung in der ersten Zeile der Datei bb-config.php.

Deshalb ging ich davon aus, dass die Datei bb-config.php in der ersten Zeile einige Zeichen außerhalb des durch <?php ... ?> gekennzeichneten Bereiches mit PHP-Code enthalten muss – und hielt das Problem schon für gelöst. Um die Zeichen zu sehen, holte ich über den Browser direkt die bb-config.php ab, die nur eine weiße Seite liefern dürfte. Und in der Tat sah ich den etwas rätselhaften Text „“, der dort nicht hingehört und einfach nur gelöscht werden muss.

Nun, die Technik ist oft ein bisschen widerspenstig.

Denn die bb-config.php enthielt dort kein Zeichen. Ihr gesamter Inhalt war im Bereich <?php ... ?> eingeschlossen. Es gab einfach nichts zu löschen, wie mir der zukünfitige Forenbetreiber versicherte.

Und das erschien doch sehr seltsam und spornte meinen Ehrgeiz ein bisschen an, dieses Problem zu identifizieren. Es wurde Zeit für eine etwas genauere Untersuchung.

Genauere Untersuchung

Als erstes wollte ich diese seltsame Ausgabe unsichtbarer Zeichen nicht mehr im Browser sehen. Deshalb holte ich die bb-config.php auf meinem mit UTF-8-Zeichencodierung arbeitenden Linux-System mit wget ab, um mir diese rätselhafte Ausgabe einmal näher anschauen zu können.

Die nächste Tat war ein cat bb-config.php, um diese Datei einmal auszugeben – und ich sah nichts. Die vom Webserver empfangene Datei schien leer zu sein, aber der Browser stellte dennoch drei Zeichen dar, und die Datei hatte auch eine Dateigröße von drei Bytes. Mir war schnell klar, dass ich es hier nicht mit gewöhnlichen Zeichen zu tun hatte.

Deshalb schaute ich mir die Datei einmal mit od -x bb-config.php an, um ihren Inhalt in hexadezimaler Form lesen zu können. Das führte zur Ausgabe bbef 00bf.

Und dann erst verstand ich das Problem wirklich.

Um hier zu sehen, welche Reihenfolge von Bytes in der Datei vorliegt, muss noch berücksichtigt werden, dass auf Intel-Systemen (PCs) immer zunächst das niederwertige Byte und dann das höherwertige Byte kommt. (Informell sage ich dazu: aus den üblichen Gemeinheitsgründen.) Der Webserver hat mir die drei Bytes (hexadezimal ausgedrückt) ef bb bf gesendet, und diese müssen noch vor dem <?php in der bb-config.php gestanden haben.

Das war auch die Auflösung. Es handelt sich um die Angabe der Bytereihenfolge in einer Textdatei im Unicode-Format, in diesem Fall wird das Dateiformat als UTF-8 angegeben.

Der Editor, mit dem die bb-config.php bearbeitet wurde, hat offensichtlich in UTF-8 gespeichert und die Datei mit einem BOM begonnen. Diese Markierung bleibt natürlich fast immer unsichtbar, und so kam es zum rätselhaften Verhalten – und der zukünftige Forenbetreiber war sich nicht darüber bewusst, dass am Speicherformat eines Texteditors etwas Problematisches sein könnte…

Da kommt man aber auch nicht so leicht drauf. Es ist wirklich ein arges Problem. ;-)

Lösung des Problems

Die Editoreinstellungen zum Speichern der Dateien müssen geändert werden. Entweder muss die Speicherung der BOM abgeschaltet werden, oder aber – im Zweifelsfall und für technisch weniger erfahrene Nutzer wohl die beste Wahl – das Speicherformat muss zumindest zum Speichern der bb-config.php auf ASCII gesetzt werden.

Wie das beim einzelnen Editor geht, kann ich natürlich nicht sagen, aber zum Glück hat jedes brauchbare Programm ein Hilfesystem und eine gute Dokumentation. (Denn ohne Dokumentation ist kein Programm brauchbar.)

In diesem einen Fall ist das Problem jedenfalls gelöst und das Forum ist wieder benutzbar, und ich kann mir durchaus vorstellen, dass dieses Problem häufiger auftritt und zu großem Unverständnis und Frust führt, wenn man damit konfrontiert ist.

Probleme mit XAMPP und bbPress

XAMPP ist eine sehr beliebte Distributon eines WAMP für Microsoft Windows. Die Installation entspricht dem unter Windows gewohnten Standard, und nach dem setup.exe stehen alle Komponenten des Systemes zur Verfügung. Das ist eine große Erleichterung für jeden, der eine Webanwendung lokal ausprobieren oder sich persönlich anpassen möchte, dabei seine vertraute Arbeitsumgebung am Computer haben möchte und sich dennoch nicht durch die manchmal etwas anspruchsvolle Installation der benötigten Einzelanwendungen arbeiten möchte. Und daher rührt auch die Beliebtheit. (Einen „richtigen“ Webserver würde ich damit allerdings nicht betreiben wollen.)

In der Kombination bbPress und XAMPP treten jedoch immer wieder einmal Fehler auf, die zurzeit niemand richtig zu verstehen scheint – zumindest entsteht im englischsprachigen Forum dieser Eindruck. Schon bei der Installation von bbPress unter einem aktuellen XAMPP gibt es diverse Warnungen, dass die Verwendung von Referenzen bei Funktionsaufrufen „deprecated“ (veraltet) sei, und wenn man noch vor dem ersten Installationsschritt, also sozusagen im Schritt Null, mit diversen derartigen Meldungen überschüttet wird, ist das alles andere als ermutigend. Zudem treten sie auch im Forumsbetrieb auf.

Diese Meldungen bleiben auch bestehen, wenn die Deprecated-Meldungen in der php.ini durch Maskieren mit einem & ~E_DEPRECATED abgeschaltet werden.

Letzteres ist ein Fehler, aber mit Sicherheit ein Fehler der PHP-Version, die mit XAMPP ausgeliefert wird, denn diese Meldungen sollten durch eine derartige Einstellung völlig unterdrückt werden. Eine solche Unterdrückung ist auch sinnvoll, da hier kein wirklicher Fehler auftritt, sondern ein Sprachmerkmal von PHP4 benutzt wird, das in PHP5 eben als veraltet gilt und in künftigen Versionen möglicherweise nicht weiter unterstützt wird. Zurzeit strebt bbPress noch die vollständige Kompatibilität mit PHP4 an, dies wird sich wohl erst ändern, wenn auch der letzte Hoster PHP5 anbietet.

(Es gibt gute Gründe, bei PHP4 zu bleiben, einer davon ist die hohe Robustheit von PHP4, die weniger administrativen Aufwand beim Betrieb eines Servers erforderlich macht. Dieses Maß an Robustheit zu erreichen, liegt noch auf dem Weg, den PHP5 zu beschreiten hat.)

Leider habe ich hier keine Möglichkeit, dieses Problem nachzuvollziehen, weil ich kein Windows zur Verfügung habe. (Und nein, auf mein Linux kommt mir kein XAMPP, ich bin darauf angewiesen, dass alles gut läuft und deinstalliere keine funktionierende Software!) Wenn jemand diesen Fehler analysieren könnte und das XAMPP-Team und vielleicht auch das englische bbPress-Forum mit näheren Informationen versorgen könnte, denn wäre das sicherlich für viele Menschen eine große Hilfe.

Deutsche Installationsanleitung

Ich habe mir die Mühe gemacht, eine deutschsprachige Anleitung für die einfache Installation eines bbPress-Forums zu schreiben. „Einfache Installation“ meint in diesem Zusammenhang, dass das recht komplexe Thema der WordPress-Integration nicht behandelt wird – es ist komplex genug für eine spätere, eigene Dokumentation. Dafür sind jedoch ein paar Gedanken zum oft ignorierten Thema der Sicherheit einer bbPress-Installation eingeflossen.

Das Ergebnis ist ein 18seitiges PDF, das wie üblich unter der sinngemäß anzuwendenden Allgemeinen Lizenz für freie Musik zur Verfügung gestellt wird.

Download-Link: Anleitung für die einfache bbPress-Installation

Installation

Wenn Sie die deutsche Sprachdatei vor der Installation ihres bbPress-Forums aufspielen, denn werden sie auch in deutscher Sprache durch den gesamten Installationsvorgang geführt. Sie können aber auch eine bestehende Installation „deutsch machen“.

Ausführliche Anleitungen zum Download

Kurzanleitung: Neuinstallation

  1. Wenn Sie es noch nicht getan haben, laden Sie sich bbPress auf der englischsprachigen bbPress-Website herunter.
  2. Laden Sie die deutsche Sprachdatei herunter.
  3. Entpacken Sie die ZIP-Archive von bbPress und von der deutschen Sprachdatei mit Ihrem dafür bevorzugten Programm.
  4. Legen Sie im bbPress-Verzeichnis ein Unterverzeichnis my-languages an.
  5. Kopieren Sie in dieses Verzeichnis die Datei de_DE.mo hinein.
  6. Wenn Sie bbPress installieren, können Sie zum Anfang des Installationsvorganges Ihre gewünschte Sprache auswählen und die Konfiguration wird automatisch erstellt. Nach der Auswahl der Sprache werden Sie in Deutsch durch die weiteren Installationsschritte geführt.
  7. Das war es auch schon. Sie haben nach der erfolgreichen Installation ein deutsches bbPress mit vollständiger deutscher Übersetzung.

Kurzanleitung: Vorgehen bei einer bestehenden Installation

  1. Laden Sie sich die deutsche Sprachdatei herunter.
  2. Legen Sie auf dem Webserver im bbPress-Verzeichnis ein neues Verzeichnis  my-languages an.
  3. Kopieren Sie in dieses Verzeichnis die Datei de_DE.mo hinein.
  4. Bearbeiten Sie die Datei bb-config.php ihrer bbPress-Installation und fügen Sie dort die folgende Zeile ein:
    define ('BB_LANG', 'de_DE');
  5. Nun sollten Sie ein laufendes bbPress in deutscher Sprache haben.