PHP ASCII URL-Encoding Probleme

Fleshgrinder

Lt. Junior Grade
Registriert
Mai 2005
Beiträge
405
So, jetzt bastel ich hier schon seit einer Ewigkeit rum und komm nicht dahinter. Vielleicht kann mir hier jemand helfen oder zumindest das Problem erklären.

Ich habe eine URL die wie folgt aussieht:

http://www.example.com/Nützliche_Links

Soweit so gut, durch URL-rewriting, spezielle .htaccess Einstellungen und dem darunterliegenden PHP Skript wird die Seite perfekt angezeigt, in allen Browsern. Nun zum paradoxen.

http://www.example.com/Nützliche_Links funktioniert!

http://www.example.com/N%FCtzliche_Links funktioniert nicht!

Obwohl die untere Kodierung den Empfehlungen des W3Cs folgt wird es nicht korrekt umgeleitet.
Siehe auch:
- RFC 3986
- URL-Encoding - Wikipedia
- W3Schools: HTML URL Encoding Reference

Bei Wikipedia funktionieren übrigens beide obigen Varianten, ich bin die Skripts von MediaWiki auch durchgegangen, konnte jedoch nichts finden was mir irgendwie weiterhilft.

Auf jeden Fall wird bei Verwendung der URL-Encoding Standards das Zeichen falsch interpretiert und als übergeben. Was natürlich zu einem Fehler führt, da es kein valides Zeichen ist und ich somit auch keinen Datenbankeintrag hierfür habe.

Frage ich die URL ab (also z. B. mit $_SERVER['REQUEST_URI']) hätte ich die Möglichkeit die URI mit dem kodierten Wert in einer Variablen abzulegen um dann z. B. mit str_replace die möglichen Zeichen zu ersetzen. Jedoch kann das imho nicht die Lösung für dieses Problem sein.

Die Funktionen urldecode() und rawurldecode() können nur die passenden UTF-8 Kodierungen korrekt umwandeln.

Jegliche Hilfe, Tipps und Tricks sind erwünscht. :)

LG
Richard
 
Bei dem ersten Link wird das ü in zwei Bytes umgesetzt. Vermutlich verwendest du hier also UTF-8 als Zeichensatz. Beim zweiten Link ist es ein Byte und definitiv ASCII. Du solltest also gucken, dass du Zeichensätze konsistent einsetzt. Dann kann dein Problem schon behoben sein.
 
Du hast absolut Recht, jedoch weiß ich das und das ist um ehrlich zu sein nicht mein Problem, ich möchte noch etwas weiter darauf eingehen.

Innerhalb der Seite gibt es mit dem verlinken der verschiedenen Seiten auch kein Problem. Ich will nur, dass die ASCII Kodierung korrekt umleitet auf die entsprechende UTF-8 Kodierung und nicht die Fehler 404 Seite ausgegeben wird. Innerhalb der Website gibt es auch keine Links die ASCII kodiert sind. Jedoch mache ich mir Sorgen wegen Suchmaschinen wie Google, oder Usern die irgendwie falsch verlinken etc. pp. Deshalb hätte ich eben gerne, dass es auch die ASCII Kodierung korrekt umleitet. Jedoch eine riesige str_replace Funktion zu erstellen würde mir jetzt nicht wirklich Spaß machen, sollte es nicht anders gehen, werde ich es machen.

Beispiel Anhand von Wikipedia:
http://de.wikipedia.org/wiki/Europäisch_Kurzhaar funktioniert
http://de.wikipedia.org/wiki/Europ%E4isch_Kurzhaar funktioniert
http://de.wikipedia.org/wiki/Europäisch_Kurzhaar funktioniert

Genau das will ich auch erreichen!

Alles andere habe ich schon umgesetzt, sprich: Leerzeichen werden korrekt umgewandelt in Underlines und direkt umgeleitet; kleingeschriebene Wörter die eigentlich groß sein sollten werden korrekt umgeleitet; immer mit 301 moved permanently;

Danke für dein Kommentar! :)

LG
 
Die .htaccess ist ziemlich kompliziert, liegt aber daran, dass die Leute die das Ganze ursprünglich programmiert haben, null Ahnung haben vom Apache und im Besonderen von mod_rewrite.

Kann dir jetzt keine Zeile rauskopieren, bin nicht mehr im Büro und der Server ist über IPs gesperrt und meinen Laptop mit VPN hab ich im Büro gelassen. Werde am Montag hier einen Auszug posten und auch das von dir gefundene ausprobieren.

Danke für deine Mühen. :)

LG
 
Mach doch einfach mit ner Regular-Expression (oder notfalls einem einfachen str_replace) eine Übersetunzg der betroffenen Sonderzeichen ganz an den Anfang der index.php (oder wo auch immer dein URL-Rewriting hingeht). Es geht ja wohl nur um die deutschen Sonderzeichen und das sind ja ned so wahnsinnig viele.
 
Hallo, BerniG, wie im Eingangsbeitrag schon geschrieben, wäre dies die Notlösung - klar. Mir geht es jedoch darum eine schnellere Variante zu finden. Die Sache ist nämlich die, dass schon sehr viele Redirects und preg_match, str_replace Funktionen im Skript sind, da ich die URLs erst vor kurzem umgestellt habe.

Die .htaccess Lösung von Stefan- scheint mir deshalb eine sehr gute Lösung zu sein, da sie verdammt schnell geht. Alle regex Funktionen von PHP sind nunmal etwas langsam und bei mehreren Tausend Seitenaufrufen macht sich das irgendwann auch bemerkbar.

Ihr könnt übrigens die Seite gerne ansehen: http://www.vivatier.com/

Ist, wie gesagt, nicht von mir programmiert, ich kümmer mich nur ein wenig mit drum (SEO). Wenn ihr oben auf „Hunde“, „Katzen“, „Vögel“ etc. pp. klick und dann ein Tier raussucht gelangt ihr zu den umgeschriebenen URLs.

LG

PS: Nein es geht nicht nur um die Deutschen Umlaute, alles. Es gibt sehr viele Hunderassen mit Portugisischen oder Spanischen Namen, deshalb benötige ich alle Umlaute. Siehe z. B.: http://www.vivatier.com/Hunde/Cão_de_Agua_Português
 

Ähnliche Themen

Zurück
Oben