WordPress, MathML, Latex – vertical space between (aligned) formulas

This is only a small tip regarding the vertical spacing of formulas/equations in WordPress plugins which understand the LaTex notation. As e.g. the plugin “MathML Block”.

Very often when you align formulas with the
\begin{align} equ 1 \\ equ 2 \end{align}
commands the vertical arrangement of the equations may appear sub-optimal: The equations get very close in vertical direction.

Especially when you work with complex formulas that have some significant vertical extensions the vertical distance between adjacent equations often becomes too small in my opinion.

As I am not an experienced user of neither Latex nor MathML I always fiddled around with some invisible \phantom{} creation in the lower formulas which gave me sufficient extra vertical space. But this is a tiresome approach. As I learned some days ago from a tex-related stackexchange post there is a much simpler recipe:

The line-break symbol “\\” can be extended like “\\[6pt]“. This will give you exactly the vertical separation you want to get. For details see the following link:

add vertical space between equations” at tex.stackexcange.com from an author LaRiFaRi.

I think this simple trick is worth spreading as it saves so much time!


A remarkable experience with a HTTP Error 406 and some security measures of a web-hosting-provider

It is very seldom that you are confronted with a HTTP status message of type 406 “Not acceptable”. However, this happened yesterday to a customer who uses a renowned hosting provider (in Norway) to publish his web-sites. The customer uses his own WordPress installation on hosted web-servers. His favorite browser is Firefox on a Win 10 desktop system. A week ago he could work without any restrictions. Then suddenly everything changed.

Access to website and WP admin interface broken due to security measures of the provider

At some point in time during last week the hosting-provider changed his security policies on his (Norwegian) Apache servers. The provider seems to have at least changed settings of the “mod_security” module – and thereby started to eliminate old browsers by some rules. (Maybe they even introduced the use of the mod_security module for the first time ?). To implement mod-security with a reasonable set of rules basically is a good measure.

However, the effect was that our customer got a 406 error whenever he tried to access his web-site with his Firefox browser. The “406 Not Acceptable” message indicates that a web server cannot or will not (due to some rules) satisfy some conditions in the HTTP GET- or POST-request. Our customer uses the latest version of Firefox. He tested whether he got something similar on a test installation of one of our hosted servers in Germany. Of course not.

A subsequent complaint of our customer was answered by his provider; the answer in a direct translation says:

Contact the Firefox technicians or use Chrome!

Very funny! Our customer asked us for help. We tested the web-servers response with multiple browsers from Linux and Windows desktops. The problem seemed to exist only for Firefox and only on desktop systems. This already indicated a strange server reaction to the HTTP “User-Agent” string.

But this was only part of the strange experience our customer got due to new security measures. In addition his provider enforced the usage of an Apache htaccess password (Basic HTTP user authentication) for all users who maintained their own WordPress installation on the hoster’s web-servers. Our customer suddenly needed to provide a UserId and a password to get access to his WordPress installation’s “wp-admin”-directory. We found out about this intentionally imposed restriction by having a look at the public web site of the provider. There, in a side column, we found a message regarding the new restriction. Customers were asked there to contact the hoster’s specialists for required credentials. Our customer had not been directly informed by the provider about this new policy. So, we just sent the provider a mail and asked him to give us the authentication data to the admin folder of our customer’s WP-installation. We got it one day later via email.

In my opinion these procedures indicate some mess we are facing with improperly handled IT-security activities these days.

Some comments regarding enforced HTTP Basic Authentication for WP’s admin directory

Comment 1: It is, of course, OK to enforce a HTTP password access to directories of a web server. But this is only an effective protection measure if the provider at the same time enforces general TLS/SSL encryption for the access to the hosted web-sites. Otherwise the password would be sent in clear text over the Internet. However, you can still work with a WordPress installation or other CMS-installations on the provider’s web-servers without any SSL certificate. Our customer has a SSL-certificate – but he had to pay for it. Here business interests of the provider obviously collide with real security procedures.

Comment 2: Personally, I regard it as a major mistake to set a common UserID and a fixed permanent password for customers and send
these credentials to a web-admin via an unencrypted email. Ironically enough the provider asked the receiver in the mail to take note of the password and then to destroy the mail. So, mails on the customers mail system are dangerous, but the transfer of an unencrypted mail over at least partially unencrypted Internet lines is not?

Hey, we are not talking about a one time password here – but permanent credentials set and enforced by the provider. The CPanel admin tool offered by the hosting provider does NOT allow for the change of the fixed htaccess password set by the provider’s admins.

Furthermore, why announce this policy on a public website and not inform the customers via a secure channel? Next question: How did they know that we were authorized to request the access data without contacting our customer first ???

The mess with the User-Agent string

Also interesting was the analysis of the Firefox problem. We can demonstrate the effect on the provider’s own website. Here is what you presently (18.10.2019) get when opening the homepage of the provider with Firefox from a Linux desktop:

And here is what you get when you manipulate the User-Agent string a bit:

The blue rectangles have been added not to directly show the provider’s name. Note the 406 error message in the FF developer tool at the bottom!

Well, well … Our customer got the following when opening his own web-page:

Some analysis showed that we get a correct display of the web-site on the same browser if we manipulated the HTTP User-Agent-string for Firefox a bit. One way to do this is offered by the web developer tools of Firefox. However, there are also good plugins to fake the User-Agent string.

The next question was: What part in the User-Agent-string reacted the provider’s Apache servers allergic to?

The standard User-Agent-string of Firefox in a HTTP-GET- or POST-request is defined to have the following structure:

Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion

This can be learned from related explanations of mozilla.org:
Firefox User Agent string

“geckotrail” can be an indication of a version or a date. However – quotation:

On Desktop, geckotrail is the fixed string “20100101”

And when we check the User-Agent-string for Firefox on e.g. a Linux desktop we indeed get:

Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko Firefox/68.0


Posted in Security und Security-Tools, Web - Browser, HTTP, HTML, CSS | Tagged , , , , ,

WordPress-Blog mit Themes in eine neue Domäne auf einem anderen Apache-Server umziehen

Gestern hat mich ein Problem meiner Frau etwas Nerven gekostet:
Sie erstellt gerade eine Webseite für eine Firma auf Basis von WordPress [WP] unter Einschluss des Pinnacle Themes. Ich selbst bin ehrlich gesagt kein Freund solcher viel zu komplexen und deshalb wenig performanten Themes. Aber ich hatte da nichts zu entscheiden.

Jedenfalls stand am gestrigen Morgen der Transfer der WP-Installation von einer gehosteten Testdomäne bei “1&1” zur endgültigen Zieldomäne des Auftraggebers an. Letztere wird auch gehostet – allerdings beim Provider “Strato”. Unter “Hosting” verstehe ich dabei klassisches Web-Hosting: Man erhält auf einem Server einen per “chroot” abgesicherten Web-Space. Man teilt sich aber die Ressourcen des Webservers mit anderen Usern und hat keinerlei Kontrolle über die Serverkonfiguration selbst.

Schritte für einen WP-Umzug zu einer anderen Domäne und auf einen anderen Webserver

Zu bewältigen war also ein WordPress-Umzug zwischen zwei Domänen bei zwei klassischen deutschen Web-Hosting-Providern. Beide Provider nutzen Apache- und MySQL-Server. Man stellt sich den Umzugsprozess deshalb als gut beherrschbar vor. Als notwendige Teilschritte fallen einem sofort die folgenden ein:

  • Datenbank-Export vom Datenbankserver des alten Hosters (hier 1&1) auf ein eigenes Linux-System; den Export kann man mit PhpMyAdmin vornehmen. Wir erhalten dadurch ein Text-File mit den erforderlichen SQL-Statements für einen späteren Import und natürlich mit den Inhalten der Datenbankfelder selbst.
  • Änderung der Domain-Adresse [URL] und ggf. auch absoluter Server-Pfade in der SQL-Datei. Diesen Schritt kann man z.B. mittels eines schrittweisen “Search und Replace” unter “kate” oder einem anderen Linux-Editor vornehmen.
  • Datenbankimport des modifizierten SQL-Files in die Zieldatenbank eines MySQL-Servers beim neuen Provider; wieder mit PhpMyAdmin.
  • Kopieren der WordPress-Verzeichnisse und WP-Dateien per SFTP vom alten Web-Server (Webspace) auf einen Linux-Desktop und von dort weiter auf den Ziel-Webserver (Strato). Hierzu verwendet man ein FTP-Tool wie etwa Filezilla.
  • Änderung der Einträge in der “wp-config.php” (u.a. der Datenbank Access Daten) und Transfer der modifizierten Datei auf den Zielserver.

Leider ist ein WP-Umzug manchmal nicht ganz so einfach. Gestern stolperte ich in 2 typische Fallen. Die zweite davon war mir schon mal begegnet; ich hatte sie aber schlicht vergessen.

Problem 1: Erfordert der Zielserver bestimmte Gruppenrechte für den Zugriff auf Dateien?

Der Standard-Rechtekamm auf Web-Servern, die per FTP erreichbar sind, kann sich durchaus unterscheiden. Und manchmal sind gezielte Rechtesetzungen erforderlich, damit eine Web-Anwendung anstandslos läuft.

Interessant ist in diesem Zusammenhang u.a. eine Unterscheidung des Owners der zugänglichen Web-Verzeichnisse/Dateien von demjenigen User unter dem die Apache-Prozesse laufen. Von Bedeutung ist etwa die Gruppenzugehörigkeit des letzteren Users. Ich selbst lege eigene Apache2-Server oft so an, dass die Apache-Prozesse unter einem User laufen, der Mitglied einer Standard-Gruppe ist, welche wiederum den Webserver-Verzeichnissen zugeordnet wird. Für neu anzulegende Verzeichnisse/Dateien unterhalb des chroot-Pfades werden die Rechte dann über SGID und/oder ACLs gesteuert.

Nun gibt es aber leider keine allgemeingültigen Regeln, was die erforderlichen Zugriffsrechte auf verschiedene Dateitypen anbelangt, damit komplexe Web-Anwendungen funktionstüchtig laufen.

So kann man etwa die PHP-Ausführung sowohl in FastCGI- als Apache-Modul-Installationen so einrichten, dass der Apache-Prozess dabei die Rechte des PHP-File-Owners annimmt und mit diesen Rechten auf weiteren Dateien operiert (
“suexec”-Varianten). Anders mag es aber aussehen, wenn ein Webserver oder andere Prozesse unabhängig von PHP direkt auf Dateien zugreifen müssen. Beispiel: PHP erstellt auf Anforderung eines Browsers auf dem Server eine HTML-Datei; diese lädt im Browser JS-Programme nach und letztere wiederum fordern Bilder zur Darstellung im Browser an. Nehmen wir an, der Apache-Prozess gehöre zu der Gruppe von Nutzern, die auf die hochgeladenen Dateien des Webservers zugreifen darf. Dann muss die Gruppe ggf. zwar nicht unbedingt ein “read”-Recht haben, um PHP-Dateien ausführen zu können, wenn das über suexec-Mechanismen geregelt wird. Aber wenn ein nachgelagertes Javascript-Programm eine Bilddatei lesen muss, gibt es womöglich doch ein Problem, falls diese Bild-Datei auf dem Webserver nicht mit dem erforderlichen Gruppenrecht versehen wurde.

Warum werden Rechte im Kontext eines WP-Umzugs u.U. wichtig?
Installiert man WP, so analysiert WP selbst, unter welchen Rechten (bzw. welcher UID) ein PHP-Programm läuft – unter denen des Apache-Prozesses oder denen des File-Owners? Daran richtet sich dann die Installation aus. Was aber, wenn das Analyseergebnis auf einer Test-Umgebung nicht zur Ziel-Umgebung des späteren Produktivservers passt?

Genau eine solche Situation trat gestern in unserem Fall auf und führte gleich zwei Teil-Probleme mit sich.

Problem 1.1: Kann die “.htaccess”-Datei von relevanten Prozessen gelesen werden?
Ich beschreibe mal, was mir im Zuge unseres geplanten Umzugs passierte:
Auf dem Zielsystem bei Strato schien die von WP ursprünglich auf dem 1&1-Server angelegte und von uns kopierte “.htaccess”-Datei nicht zu wirken. Die “.htaccess” ist aber für den gesamten WordPress-Prozess entscheidend: Sie aktiviert die “Rewrite Engine” des Apache-Servers und verweist alle URL-Anfragen zu nicht existierenden Dateien und Verzeichnissen zur Auflösung an die zentrale “index.php” der WP-Installation.

Beim Aufruf bestimmter Dateien im Browser kam auf unserem Zielsystem laufend die Meldung, dass ich auf diese Dateien “nicht zugreifen dürfe”. Das geschah etwa, wenn ich den Zugriff auf HTML-Dateien versuchte. Löschte ich dagegen die “.htaccess” auf dem Zielserver und transferierte eine eigens neu angelegte HTML-Datei in das Domain-Verzeichnis auf dem Zielserver, so war alles OK. Die HTML-Datei wurde auf Anforderung anstandslos im Browser dargestellt.

Zunächst dachte ich an einen seltsamen Fehler in der “.htaccess”-Datei. Der Grund war aber ein anderer:

Mein FTP-Programm hatte die auf dem 1&1-Server geltenden Berechtigungen 1:1 auf mein lokales Linux-System abgebildet und diese Berechtigungen danach auch auf den Zielserver transportiert. (Die meisten FTP-Programme haben heute Parameter, die das Erzeugung des Rechtekamms auf dem Zielsystem steuern, soweit dieses die Rechtevergabe gem. eigener Regeln/ACLs überhaupt zulässt). Der Rechtekamm für die “.htaccess”-Datei war auf dem 1&1-Server ursprünglich aber “604” gewesen.
Auf dem Zielsystem bei Strato hing die Lese- (und auch die Schreib-) Berechtigung bestimmter Webserver-Prozesse dagegen offenbar an den Gruppen-Rechten! Mindestens mal für das Auslesen der “.htaccess”-Datei!

[In diesem Zusammenhang ist es übrigens bemerkenswert, dass bei Strato schon das Anlegen eines Dateischutzes per “.htaccess” irgendwelche besonderen Programme zu involvieren scheint …]

Bei 1&1 hingegen musste die Gruppe hingegen keine Zugriffsrechte auf die “.htaccess”-Datei haben; dort genügte vielmehr das Leserecht von “Others”. Offenbar weichen die Server-Installationen der beiden Provider für Web-Hosting deutlich voneinander ab!

Lesson learned:

Das Leserecht für die Gruppe ist auf manchen Serverinstallationen zwingend erforderlich, damit eine “.htaccess”-Datei ordnungsgemäß ausgewertet werden kann.

Ich kam in unserem Fall bei Strato zufällig drauf, als ich das “.
htaccess”-File auf meinem Desktop händisch neu anlegte, mit wachsendem Inhalt versah und immer wieder auf den Zielserver hochlud. Das führte erst zur Vergabe von Standardrechten für den Gruppenzugriff auf meinem Linux-Desktop (644); diese Rechte wurden nach dem SFTP-Transfer auch auf dem Server wirksam. Mit positiven Folgen! Die “.htaccess” griff nun endlich.

Problem 1.2: Können auch andere Dateien ohne Gruppenrechte gelesen werden?
Tja, meine einleitenden Sätze deuteten ja schon an, dass die Politik von Providern hier nicht zwingend einheitlich aussehen muss. Der ursprüngliche, von 1&1 vielfach kopierte Rechtekamm “604” erwies sich auf dem Zielserver jedenfalls auch bzgl. anderer Dateien als der “.htaccess” als problematisch: U.a. konnten vorhandene Bild- und Medien-Dateien nicht ausgelesen werden.

Das erklärt sich etwa wie folgt: Laufen bestimmte Server-Prozesse über User, die Mitglied der Gruppe, aber nicht der Owner der zu verarbeitenden Datei sind, so können diese Prozesse (ohne weitere besondere Massnahmen wie suexec) im Falle eines Rechtekamms “604” die Datei trotz des Leserechts von “Others” in keinem Fall lesen! [Off Topic: Das ist unter Linux nützlich, um bestimmte Gruppen von Usern definitiv vom Zugang zu bestimmten Dateien auszusperren, zu denen aber alle anderen Nutzer ungehinderten Lese-Zugang haben sollen.]

Selbst als die “.htaccess” wieder griff, kam es deshalb nach unserem WP-Umzug zu weiteren Fehlern – nämlich immer dann, wenn der Webserver Dateien lesen und bereitstellen sollte, für die die Gruppenrechte nicht hinreichend waren.

Ein pauschales Setzen der “644”-Berechtigung für relevante Zieldateien (bzw. “755” für Verzeichnisse) war per FTP-Programm dann aber schnell durchgeführt. Danach konnten auf dem Zielserver alle Webseiten angesprochen werden.

Wichtiger Hinweis: Die wp-config.php sollte natürlich nie für “Others” lesbar sein – also für diese Datei bitte einen Rechtekamm “600” oder “640” wählen!

Problem 1.3: Laufen PHP-Dateien evtl. auch ohne Gruppenrechte?
Der obige Befund deutet zunächst mal an, dass der Apache-Web-Prozess unter einem User läuft, der Mitglied der Gruppe ist, die beim Hoster Strato den Webspace-Dateien zugeordnet werden. Weitere Tests ergaben aber, dass der Webserver sehr wohl auf PHP-Dateien zugreifen und die ohne Gruppenrechte ausführen konnte. (Strato bietet die PHP-Ausführung im rahmen aktuellen Web-Hostings übrigens über eine FastCGI-Implementierung an.)

Ich zeige mal den Rechtekamm für verschiedene Dateien:

Man erkennt, dass die “.htaccess”-Datei nun das Gruppenrecht zum Lesen aufweist. Hingegen sind der Gruppe alle Zugriffsrechte auf die PHP-Dateien entzogen. Dennoch läuft WordPress inkl. Pinnacle Theme einwandfrei; auch andere, selbst angelegte PHP-Dateien lassen sich mit dem Rechtekamm “600” anstandslos ausführen. Probleme gab und gibt es jedoch bzgl. des Lesens von Dateien mit Rechten wie der “readme.html” auf dem Bild; der Abruf dieser Datei über einen Browser führt zu einer Fehlermeldung

You don’t have permission to access /readme.html on this server.

Also sind – wie oben angedeutet – spezielle “suexec”-Mechanismen für die Ausführung von PHP-Dateien mit den Rechten des Owners zu vermuten. Das lässt sich mit bestimmten Apache-Modulen bewerkstelligen.

Bei 1&1 sah ein funktionierender Kamm dagegen wie folgt aus:

Hier erfordert das Lesen und Bereitstellen von anderen als PHP-Dateien offenbar das “read”-Recht von “others”. Das mag nun jeder selbst bewerten.


Auf unserem gehosteten Strato-Webspace benötigt man für die Ausführung und das Lesen von PHP-Dateien nur einen Rechtekamm der Form “600”. Der Abruf und die Bereitstellung von anderen Dateien durch den Webserver verlangen aber mindestens einen Kamm der Form “640”.

Was bedeutet das für Leute, die eine WP-Installation nach einem Umzug besonders härten wollen und sich nicht mit pauschalen Rechte-Kämmen zufrieden geben wollen? Leider muss man sich auf dem gehosteten Web-Space mancher Provider – wie etwa Strato – selbst um eine unterschiedliche Rechtevergabe für PHP-Dateien im Gegensatz zu anderen Dateien kümmern. (Wohl dem, der dafür einen SSH-Zugang hat und zur Abänderung der Rechte mit Linux-Shell-Kommandos arbeiten kann!)

Lesson learned:

Web-Server-Konfigurationen sehen bei verschiedenen Web-Hosting-Providern unterschiedlich aus. Man sollte schon vor einem WP-Umzug von einem Provider zu einem anderen genauer studieren, welche Zugriffsrechte für eine volle Funktionalität erforderlich sind. Dabei sind vor allem Gruppenrechte interessant. PHP-Dateien können ggf. allein mit den Rechten des File-Owners ausgeführt werden. Der Zugriff auf andere Dateien kann dagegen aber zwingend Gruppenrechte erfordern. Ggf. müssen die Datei-Rechte beim Umzug also an die Erfordernisse auf dem Zielserver angepasst werden. Das Leserecht für die Gruppe kann speziell für den Zugriff auf die “.htaccess”-Datei relevant sein.

Nach dem Umzug und einer Vergabe der minimal erforderlichen Rechtekämme für die unterschiedlichen Dateitypen in den WP-Verzeichnissen sollte man übrigens unbedingt auch mal testen, ob sich WP selbst und auch alle Plugins noch über entsprechende WP-Funktionalitäten upgraden lassen!

Problem 2: Serialisierte Information in den Datenbanktabellen verträgt eine Änderung der Länge des Domain-Strings nicht!

Nach der Bereinigung der Rechte-Probleme funktionierte in unserem Fall zwar das Apache-Rewriting wieder – und auch alle erstellten WP-Seiten wurden im Browser wieder samt eingebundenen Bilddateien angezeigt. Aber leider nicht im gewünschten Layout!

Sämtliche im Usprungssystem vorgenommenen Theme-Einstellungen und eigene CSS-Einstellungen (und das waren viele!) funktionierten nicht mehr! Es schien zunächst so, als ob sämtliche Theme- und CSS-Einstellungen beim Umzug des WP-Blogs verloren gegangen wären! Es gab also noch ein Problem, das zu lösen war.

Es ist ein wenig unübersichtlich, wie WP-Themes modifizierte CSS-Anweisungen behandeln und wo sie sie hinterlegen. Ein Teil fließt in reguläre CSS-Dateien ein. Ein anderer Teil aber – wie z.B. CSS-Einstellungen durch den User – werden (je nach Theme) auch in Datenbanktabellen hinterlegt. Das ist etwa beim Pinnacle-Theme der Fall. Ich begab mich bei der Analyse des Problems also zunächst einmal in die Niederungen der WP-Datenbank-Einträge.

Betrachtet man das exportierte SQL-File einer WP/Pinnacle-Installation und sucht dort ein wenig, so findet man tatsächlich die spezifischen CSS-Vorgaben, die man als User/Admin vorgenommen hat, als Datenbankeintrag der “Options”-Tabelle wieder. Warum also zogen z.B. diese Anweisungen auf dem Zielsystem nicht?

Beim genaueren Hinsehen entdeckt man weiter, dass der betreffende String-Eintrag wie auch viele andere Feldeinträge in den WP-Tabellen die Form sog. serialisierter Arrays haben. Unter der Serialisierung eines Arrays einer Programmmiersprache (hier eines PHP-Arrays) versteht man die Transformation der (PHP-) Array-Information (indizierte Elemente und deren Inhalte) in einen nach vorgegebenen Regeln codierten String (mit definierten Trennzeichen und Hinweisen zum Array-Aufbau). Im Rahmen von WP und
WP-Themes erfolgt eine Array-Serialisierung i.d.R. durch die PHP-Funktion “serialize()”. (Oder für die Deserialisierung später durch das Pendant “unserialize()”).

Das Entscheidende dabei ist, dass die Länge der Sub-String-Information zu einem bestimmten Array-Element im serialisierten String über eine vorgestellte Zahl des entsprechenden String-Abschnitts kodiert wird. Bsp: s:5″Ralph”. Gemeint ist hier, dass die Information “Ralph” 5 Zeichen lang ist.

Siehe hierzu etwa https://stackoverflow.com/questions/8641889/how-to-use-php-serialize-and-unserialize oder die PHP-Doku!

Array-Serialisierung vereinfacht die persistente Hinterlegung komplex strukturierter Information in Datenbank-Feldern (z.T. zu Lasten der Performance). Leider machen sich viele der Entwickler dabei das Leben leicht: Unter WP bzw. WP-Themes taucht in etlichen Datenbankeinträgen innerhalb serialisierter Arrays leider auch die URL für die Blog-Domäne auf.

Ändert man nun, unbedarft wie ich, pauschal die Domänen-URL im SQL-File auf die neue Zieldomänen-URL durch “Search und Replace”-Funktionalität ab, so wird das nicht in allen Fällen ohne Nebenwirkungen bleiben. In allen Fällen, in denen sich die Domänen-Bezeichnung innerhalb eines Serialisierungs-Strings wiederfindet, wird es i.d.R. ein Problem geben:

Die Länge des URL-Strings zu einer Testdomäne wird ja nur sehr selten mit der Länge der URL der Zieldomäne übereinstimmen! Versuchen PHP-Programme von WP oder WP-Themes nach dem Umzug, die serialisierte Information wieder in PHP-Arrays umzuwandeln, geht das natürlich schief – mit katastrophalen Folgen. Da Grenzen überschritten werden, lässt sich die Information nicht korrekt aus dem String extrahieren. Dies führt dann u.U. dazu, dass unserialize() leere oder fehlerhafte Strings in den aufzubauenden Arrays zurückliefert. Ein Ergebnis: Wichtige Formatierungsinformationen von Themes stehen gar nicht oder nur fehlerhaft zur Verfügung.

Lesson learned:

Man muss die Ersetzung von Domänen-Strings in der SQL-Datei mit Bedacht vornehmen – und eben, wo nötig, auch die vorgeschaltete Längeninformation in Strings mit serialisierter Information abändern!

Nutze für den Datenbank-Export ein WP-Plugin!

Die Modifikation der Domän-URL mit gleichzeitiger Anpassung der Serialisierungs-Information kann man zwar händisch oder unter Linux auch mit Hilfe von kleinen Scripts (awk, sed mit Regex) durchführen. Aber netterweise gibt es auch ein WordPress-Plugin, das einem zur Seite steht – nämlich “WP Migrate DB” (von Delicious Brains):

Das Plugin erzeugt einem bei Bedarf ein Datenbank-Export-File, das die notwendigen Korrekturen der Serialisierungsstrings bereits beinhaltet!

Als Input muss man dem Plugin die zu ändernde Domänen-URL sowie den absoluten (!) Serverpfad des Blogs auf dem Ziel-Webserver mitgeben. Ja, auch letztere Information taucht tatsächlich, je nach WP-Theme, in einigen wenigen Datenbankeinträgen auf! Wie kommt man nun an die Info zum absoluten Serverpath? Am einfachsten über ein PHP-File mit dem Inhalt:

  echo getcwd();

Das transferiert man per SFTP in sein Domän-Verzeichnis auf den Web-Server, ruft es anschließend im Browser auf und kopiert dann die ausgegebene Info in den Plugin-Dialog. Das SQL-Exportfile das Plugins (im UTF-8-Format) kann man schließlich wie gewohnt per PhpMyAdmin in die MySQL-Datenbank auf dem Zielserver laden.

Funktionierte bei mir anstandslos! Danach waren standen sämtliche Theme-Einstellungen wieder zur Verfügung und auch die privaten CSS-Anpassungen meiner Frau wurden korrekt gelesen und im Layout der Webseiten erwartungsgemäß umgesetzt.

Nebeneffekt: Wenigstens einmal konnte ich meine Frau mit Linux und ein wenig PHP-
Kenntnissen glücklich machen!