IPv6-Testbetrieb für heise online [2. Update]

Seite 3: URL-Umschreibung

Inhaltsverzeichnis

Doch wegen der unterschiedlichen Host-Namen ist es damit allein noch nicht getan. Denn in den Seiten von www.heise.de stecken viele absolute URLs, die mit <a href="http://www.heise.debeginnen.Würde www.six.heise.de diese einfach durchreichen, würde der erste Klick auf einen solchen Link den IPv6-Surfer wieder auf den IPv4-Server werfen.

Grundlegend können wir das lösen, indem wir unserem CMS beibringen, je nach Transport-Technik verschiedene Hostnamen in die Links einzubauen. Doch die Voraussetzung dafür ist, dass das CMS überhaupt mitbekommt, mit welcher IP-Version die Anfrage hereinkommt. Neben Programmierung am eigentlichen CMS wären dafür auch massive Eingriffe in den Cluster nötig.

Alternativ könnten wir auch www.heise.de komplett auf relative URLs umstellen. Neben Umbauten am CMS würde das auch bedeuten, die an verschiedenen Stellen noch vorhandenen statischen HTML-Seiten zu bearbeiten.

Daher gehen wir für den Probebetrieb einen anderen Weg: Der Proxy durchforstet die HTML-Seiten und ersetzt alle absoluten Links auf www.heise.de durch solche auf www.six.heise.de.

Mehr Infos

RequestHeader unset Accept-Encoding

Für das Umschreiben der Links setzten wir zunächst das Modul mod_proxy_html, das nicht aus dem Apache-Projekt stammt. Es bearbeitet den Datenstrom genauso, wie er von www.heise.de abgerufen wird. Daher müssen die HTML-Seite als Text übertragen werden und nicht etwa komprimiert. Da der Client aber eventuell per Accept-Encoding-Header die Kompression vorschlägt, entfernt der Proxy diesen Header mit Hilfe des Moduls headers_module:

Für die Link-Änderung genügen dann zwei Direktiven:

Mehr Infos

SetOutputFilter proxy-html
ProxyHTMLURLMap http://www‌.heise.de/ /

SetOutputFilter veranlasst Apache, die Daten überhaupt durch mod_proxy_html zu schicken. Schließlich ersetzt die ProxyHTMLURLMap-Zeile jedes Auftreten von http://www.heise.de in einer URL durch /, macht also aus allen absoluten URLs auf dem Server relative, die damit automatisch auf www.six.heise.de verweisen.

Es stellte sich jedoch heraus, dass mod_proxy_html für heise online nicht geeignet ist. Denn es versucht die HTML-Seiten komplett zu analysieren, was zu zwei Problemen führt. Zunächst sind die RSS-Feeds kein HTML, sondern XML, sodass mod_proxy_html sie nicht bearbeiten kann. Deshalb verwiesen auch die per IPv6 abgerufenen Feeds weiterhin auf die IPv4-Seiten.

Und zweitens verschluckt sich mod_proxy_html gelegentlich an komplexeren Konstruktionen, wie komplizierten Javascripten, die HTML ausgeben oder einigen CSS-Konstruktionen. Das führt dann zum Beispiel dazu, dass das Modul doppelte Anführungszeichen, die innerhalb des Scripts einen String einschließen, durch die HTML-Version " ersetzt.

Mehr Infos

if(plug)
{
document.write("

");
function loadFlashMiddle21(){
...

Damit ist das Script kaputt und der Browser kann die Seite nicht richtig darstellen, wie das Bild rechts zeigt.

Als Lösung stellte sich das Apache-Standard-Modul mod_substitute heraus. Es ersetzt Strings in den ausgelieferten Daten, ohne das HTML zu analysieren. Das Modul definiert die Direktive Substitute, die als Paramter einen Ersetzungsbefehl ähnlich dem des Unix-Editors sed erwartet: Ein s gefolgt von einem Trennzeichen, dem alten Text (bei Bedarf als Regular Expression), wieder dem Trennzeichen, dem neuen Text und einem abschließenden Trennzeichen:

Mehr Infos

Substitute s/alt/neu/

Darauf können noch verschiedene Optionen folgen, die genauer bestimmen, wie ersetzt wird. Für heise online setzen wir davon drei: i sorgt dafür, dass der Servername auch mit Großbuchstaben gefunden wird. Mit n werden Regular Expressions deaktiviert, was den Vergleich beschleunigt und q verhindert, dass der veränderte Text erneut durchsucht wird. Das wäre nur bei komplexeren Ersetzungen sinnvoll, deren Ergebnis wieder den Suchstring enthalten kann. Da das beim Servernamen nicht passiert, spart auch q etwas Zeit. Da der zu ersetzende String http://www.heise.de/ Schrägstriche enthält, benutzt man als Trenner besser ein anderes Zeichen.

mod_substitute ersetzt den Suchtext gnadenlos überall, wo er auftaucht. Daher sollte man ihm nur die Seiten verfüttern, in denen wirklich etwas ersetzt werden soll. Für heise online sind dies die HTML- und XML-Seiten sowie die Atom-Feeds, jeweils ausgewiesen durch ihren Content-Type. Insgesamt sieht der Abschnitt der Konfiguration, der die URLs umschreibt, daher so aus:

Mehr Infos


AddOutputFilterByType SUBSTITUTE text/html
AddOutputFilterByType SUBSTITUTE text/xml
AddOutputFilterByType SUBSTITUTE application/atom+xml
Substitute s;http://www‌.heise.de/;http://www.six.heise.de/;inq

Allerdings hat mod_substitute auch einen Nachteil: Es ersetzt eben wirklich alle Vorkommen von http://www‌.heise.de/ durch http://www.six.heise.de/. Je nach Zugangstechnik sehen Sie daher hier unterschiedliche Texte: http://www.heise.de/. Wie man an diesem Artikel erkennt, ist es durchaus möglich, den URL vor der Umwandlung zu schützen. Doch wenn der Schreiber das nicht tut, verändert mod_substitute ungewollt den Text. Das dürfte überall dort zu Verwirrung führen, wo wirklich zwischen dem IPv4- und dem IPv6-Server unterschieden wird, zum Beispiel in den Foren oder bei den Fehlermeldungen zum IPv6-Service.

Für Ihre Rückmeldungen und Anregungen haben wir eigene Seiten mit einem Wiki und einem Ticket-System eingerichtet. Per Mail erreichen Sie das IPv6-Team unter six@heise.de.