Seite 1 von 1

mod_rewrite Umlaute entfernen (ä > a, ü > u usw)

Verfasst: 19.02.2016, 17:55
von Brixton
Hallo Forum,

ich habe eine kleine Frage zur Mod_rewrite via .htaccess.

In einem kleinen Forum (dient dem Support) wurde vBulletin 5 verwendet. vBulletin 5 ist als Software...nunja, vb4 war besser.

Vor allem hat die Software massive Probleme mit Umlauten.

Das führte dazu, dass eines Tages plötzlich alle Umlaute (Charcode UTF-8) plötzich "?" waren und entsprechende Threads und Foren mit Umlauten im Namen (und dann auch der URL, entsprechend codiert) nicht mehr funktionierten.

Abhilfe schaffte die Umstellung auf ISO. Jedoch hatte das (logischerweise) zur Folge, dass in den URLs nun die codierten Zeichen stehen. Also für ü z.B. %E4

Wenn diese Codierung in der URL steht, weigert sich das Forum aber den JavaScript auszuführen der für die Bearbeitung und Administration wichtig ist.

Abhilfe habe ich erstmal geschaffen indem ich die betreffenden URLs direkt in der SQL Datenbank geändert habe und aus alle ü ein u, aus ä ein a usw. gemacht habe.

Das ist aber natürlich keine dauerhafte Lösung. Sobald User mit Umlauten kommen oder jemand ein neues Thema mit Umlauten erstellt geht die Sache von vorne los.

Daher wollte ich per Mod_rewrite alle Umlaute und codierungen aus den URLs entfernen. Bin damit aber irgendwie nicht so richtig vorwärts gekommen.

Erste Idee war:

Code: Alles auswählen

RewriteRule ^(.*)A(.*)$ $1Ä$2 [N,E=utf8_fixed:1]
RewriteRule ^(.*)a(.*)$ $1ä$2 [N,E=utf8_fixed:1]
RewriteRule ^(.*)O(.*)$ $1Ö$2 [N,E=utf8_fixed:1]
RewriteRule ^(.*)o(.*)$ $1ö$2 [N,E=utf8_fixed:1]
RewriteRule ^(.*)U(.*)$ $1Ü$2 [N,E=utf8_fixed:1]
RewriteRule ^(.*)u(.*)$ $1ü$2 [N,E=utf8_fixed:1]
RewriteRule ^(.*)ss(.*)$ $1ß$2 [N,E=utf8_fixed:1]
Davon war das Forum herzlich wenig beeindruckt. Funktionierte nicht.

Habe dann diverse Versuche gemacht, die die URL direkt enthalten haben wie z.B.:

Code: Alles auswählen

RewriteRule ^haufige-fragen$ häufige-fragen
Also sozusagen Urschleimcode. Aber auch da gabs keine Lösung. Ebenso, wenn ich statt ü direkt die Codierung %E4 genommen habe.

Hier kurz die aktuelle .htaccess:

Code: Alles auswählen

	RewriteEngine On
	RewriteBase /
	
	#In some cases where you have other mod_rewrite rules, you may need to comment out the following line
	#and change it to match your folder name. This resets the other mod_rewrite rules for just this directory
	#If your site was www.example.com/forum, the setting would be /forum/
	#RewriteBase / 

	# Send css calls directly to the correct file VBV-7807
	RewriteRule ^css.php$ core/css.php [NC,L]

	# Redirect old install path to core.
	RewriteRule ^install/ core/install/ [NC,L]

	# Main Redirect
	RewriteCond %{REQUEST_URI} !\.(gif|jpg|jpeg|png|css)$
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule ^(.*)$ index.php?routestring=$1 [L,QSA]

	# Because admincp is an actual directory.
	RewriteRule ^(admincp/)$ index.php?routestring=$1 [L,QSA]
Vielleicht hat hier jemand einen passenden Code parrat. Von Seiten des Forenherstellers ist derzeit leider wohl kein Patch zu erwarten...

Vielen Dank schon einmal für die Mithilfe.

Verfasst:
von

Verfasst: 20.02.2016, 09:21
von Melegrian
Ich denke, Du bist hier möglicherweise den falschen Weg gegangen. Umlaute hatten in einer URL noch nie etwas verloren. Schaue Dir doch einfach die Liste erlaubter Zeichen an:

https://de.wikipedia.org/wiki/Uniform_R ... er_Zeichen

Womit ich jetzt nicht meine, dass eine URL mit Umlauten nicht verwendbar ist, doch was Du je nach Browser in der Browserzeile möglicherweise als München siehst, wie in

"https://de.wikipedia.org/wiki/München"

ist doch eigentlich

"https://de.wikipedia.org/wiki/M%C3%BCnchen"

Ein neues Script auf einen anderen Charset umstellen zu wollen, ist eine sehr schlechte Lösung, da seit PHP 5.4 auch bei PHP-Funktionen eine Umstellung von ISO-8859-1 auf UTF-8 erfolgte. In Folge müsstest Du intern auch Funktionen wie

Code: Alles auswählen

htmlspecialchars($variable);
in

Code: Alles auswählen

htmlspecialchars($variable, ENT_QUOTES, " ISO-8859-1");
ändern und dabei die Reihenfolge der Parameter einhalten.

Was bei Dir nun alles schief läuft, weiß ich nicht, hängt ja auch davon ab, mit welchem Zeichensatz bisher Daten in der Datenbank gespeichert wurden und mit welchem Charset der Zugriff auf die Datenbank erfolgt und auch davon, ob einzelne Dateien, die möglicherweise Umlaute enthalten, geöffnet und anschließend fehlerhaft konvertiert und gespeichert wurden. Falls der Server nicht den richtigen Zeichensatz ausliefert, genügt es hingegen in der htaccess einen Charset anzugeben.

AddDefaultCharset utf-8

Oder als Beispiel für einzelne Dateien:

AddCharset UTF-8 .js

Letztere liegt bei mir in einigen Verzeichnissen mit JS Dateien, in denen Umlaute eine Rolle spielen.

Verfasst: 20.02.2016, 09:38
von Brixton
Das ist mir völlig klar, dass Umlaute in einer URL nicht zu finden sind, sondern codiert werden.

Genau das ist ja mein Problem. Allerdings hat das nichts mit den Scripten zu tun. An denen kann ich gar nicht rumspielen, weil das zu tief in der Programmierung der Forensoftware verankert ist.

Die Datenbank ist auf UTF-8 codiert. Eine Umwandlung auf ISO hat jedoch keine Verbesserung der Problematik gebracht.

Wahrscheinlich habe ich mich da etwas ungünstig ausgedrückt, als ich schrieb:
Ebenso, wenn ich statt ü direkt die Codierung %E4 genommen habe.
Ich habe also auch schon probiert die codes direkt per Rewrite zu wandeln.

z.B.:

Code: Alles auswählen

RewriteRule ^(.*)a(.*)$ $1%E4$2 [N,E=utf8_fixed:1] 
oder auch:

Code: Alles auswählen

RewriteRule ^(.*)a(.*)$ %E4
Auch das hat nicht geholfen. Es sollen einfach keine Umlaute in der URL sein. Weder codiert noch sonst irgendwie. Denn nur dann lädt das Forum nie nötigen Scripte für einige Funktionen.

Codiere ich das ganze Forum wieder mit UTF-8 Zeichensatz, gibt er mir gar keine Umlaute mehr aus. Also nicht in den Texten, nicht in den Links oder sonstwo. Selbst die URLs funktionieren dann nicht mehr. Klicke ich dann einen Thread mit Umlaut an, gibt sagt mir das Forum "Thema kann nicht gefunden werden", einfach weil die Codierung des Umlautes fehlerhaft ist.

Übrigens Antwort des Herstellers, nach mehrtögigen Support mit 9 Stunden Zeitunterschied:
Unfortunately, we don't have a fix at the moment. This seems to be a broad general problem with forums using other languages. They are beginning to work on the issue, but I do not have a fix version yet on the issue.
Deswegen versuche ich selbst eine Lösung zu finden. :)

Diese wäre am einfachsten, wenn ich es bewerkstelligen könnte, dass das Forum die URLs anders schreibt und dort vollständig alle Umlaute entfernt.
Deswegen soll z.B.: aus ä nicht %E4 werden, sondern einfach a.

Damit diese URL: www.seite.de/forum/h%E4ufige-fragen
So aussieht: www.seite.de/forum/haufige-fragen

Verfasst: 20.02.2016, 09:55
von Melegrian
Ja, doch nicht die Umstellung auf ISO wird es bringen, auch nicht in der htaccess nach Lösungen suchen, sondern eine Umwandung von ä in ae noch bevor die Pfade gespeichert werden. Und das ist bei einem komplexen Scripts Angelegenheit der Programmierer, die entsprechenden Lösungen mit anzubieten.

Hier zum Beispiel ein Auszug aus der formatting.php von WP:

Code: Alles auswählen

		// Used for locale-specific rules
		$locale = get_locale();

		if ( 'de_DE' == $locale || 'de_DE_formal' == $locale ) {
			$chars[ chr(195).chr(132) ] = 'Ae';
			$chars[ chr(195).chr(164) ] = 'ae';
			$chars[ chr(195).chr(150) ] = 'Oe';
			$chars[ chr(195).chr(182) ] = 'oe';
			$chars[ chr(195).chr(156) ] = 'Ue';
			$chars[ chr(195).chr(188) ] = 'ue';
			$chars[ chr(195).chr(159) ] = 'ss';
https://github.com/WordPress/WordPress/ ... atting.php

Verfasst: 23.02.2016, 01:45
von nerd
Brixton hat geschrieben: Die Datenbank ist auf UTF-8 codiert. Eine Umwandlung auf ISO hat jedoch keine Verbesserung der Problematik gebracht.
Hm verstehe ich das richtig? Du hast die datebnak vom UTF8 auf ISO umgestellt? Wenn du zeichensatz probleme mit umlauten hast, willst du aber UTF8 haben, und nicht ISO.

- Die datenbank tables selbst muessen auf UTF8-gesetzt werden (wenn nicht schon per globalem setting geschehen.
- Die datenbankverbindung muss in php auf UTF-8 gesetzt werden, sobald du die verbindung aufbaust ( https://php.net/mysqli_set_charset )
- Deine Webseite muss per html <head> oder per response-header als UTF-8 Deklariert werden!

Erst dann ist deine seite UTF-8! Gerade die ersten beiden schritte sind wichtig, da PHP und MySQL hier teilweise abenteuerliche voreinstellungen verwenden.

Uebrigens kannst du auch nicht mal eben die datensaetze einfach so umstellen indem du die table-definition aenderts oder ein str_replace drueberjagst - da gehoert deutlich mehr dazu, ansonsten zerschiesst man sich auch schnell mal den inhalt.

Verfasst: 23.02.2016, 01:57
von nerd
Melegrian hat geschrieben:Umlaute hatten in einer URL noch nie etwas verloren. Schaue Dir doch einfach die Liste erlaubter Zeichen an:
UTF-8 ist in URLs durchaus erlaubt! Moderne browser kommen damit zurecht, allerdings verschickt Firefox im hintergrund die escaped special chars, obwohl es die normalen sonderzeichen im frontend anzeigt.

Verfasst: 23.02.2016, 09:08
von Melegrian
nerd hat geschrieben:UTF-8 ist in URLs durchaus erlaubt! Moderne browser kommen damit zurecht, allerdings verschickt Firefox im hintergrund die escaped special chars, obwohl es die normalen sonderzeichen im frontend anzeigt.
UTF-8 habe ich nicht bestritten, doch Umlaute in URLs werden in HTML normalerweise bereits im Quelltext prozentkodiert, wenn man es richtig machen möchte. Der Firefox wandelt die nicht im Hintergrund, der wandelt die kodierten Zeichen eher im Vordergrund zurück in Umlaute für eine bessere Ansicht in der Browserzeile. Doch das wäre jetzt müßig, was wann wo gewandelt wird, in URLs haben zumindest Umlaute nichts verloren, sondern maximal ihre Entsprechungen in %Unicode.