Encoding von REQUEST_URI erkennen
Encoding von REQUEST_URI erkennen
am 10.08.2006 19:12:44 von Gerald Plessner
Hi,
folgendes Problem: IE und Opera encoden einen Request automatisch in UTF-8,
Firefox allerdings per Default nicht (kann über "about:config" geändert
werden, ist aber eben nicht Standardeinstellung).
Dabei geht es _nicht_ um Parameter aus POSTs und GETs, sondern lediglich um
den übermittelten REQUEST_URI.
Beispiel:
"http://www.domain.com/search/böse" kommt, wenn über den Firefox
abgeschickt, in der $_SERVER['REQUEST_URI'] als "/search/b%F6se" an, während
von IE oder Opera abgeschickt es als "/search/%C3%B6se" ankommt.
Wie kann ich jetzt per Skript erkennen, ob der REQUEST_URI UTF-8 oder anders
(ISO-8859) codiert ist? Die PHP-eigenen Erkennungsfunktionen wie
mb_detect_encoding() etc. funktionieren hier nicht, da der REQUEST_URI ein
URL-encoded ASCII-String ist.
Interessant zu beobachten: http://de.wikipedia.org/wiki/Lüttich einmal mit
IE und einmal mit Firefox aufrufen. Irgendwie können die das erkennen,
wandeln dann in UTF-8 um, url-encoded und machen einen Redirect.
Aktuelle Konfiguration: PHP 5.1.4 auf Apache 2.0.58 unter Win XP Pro.
Bin für jeden Tipp dankbar - außer er heisst "Verwende keine Umlaute in
URLs...".
Danke und schönen Gruß,
Gerald
Re: Encoding von REQUEST_URI erkennen
am 10.08.2006 21:08:13 von Carsten Wiedmann
Gerald Plessner schrieb:
> folgendes Problem: IE und Opera encoden einen Request automatisch in
> UTF-8, Firefox allerdings per Default nicht (kann über "about:config"
> geändert werden, ist aber eben nicht Standardeinstellung).
>
> Beispiel:
> "http://www.domain.com/search/böse" kommt, wenn über den Firefox
> abgeschickt, in der $_SERVER['REQUEST_URI'] als "/search/b%F6se" an,
> während von IE oder Opera abgeschickt es als "/search/%C3%B6se" ankommt.
>
> Bin für jeden Tipp dankbar - außer er heisst "Verwende keine Umlaute in
> URLs...".
Mit Umlauten in URI's wird es eigentlich erst spannend, wenn man tatsächlich
direkt Dateien mit einem Umlaut im Namen aufrufen will...
> Wie kann ich jetzt per Skript erkennen, ob der REQUEST_URI UTF-8 oder
> anders (ISO-8859) codiert ist? Die PHP-eigenen Erkennungsfunktionen wie
> mb_detect_encoding() etc. funktionieren hier nicht, da der REQUEST_URI
> ein URL-encoded ASCII-String ist.
| mb_detect_encoding(urldecode($_SERVER['REQUEST_URI']), 'UTF-8,
ISO-8859-1')
Natürlich nur, wenn die mbstring-Extension auch geladen/vorhanden ist.
Ansonsten muss man das halt mit einer kleinen Funktion machen.
Gruß
Carsten
Re: Encoding von REQUEST_URI erkennen
am 10.08.2006 21:24:07 von Sven Drieling
Gerald Plessner wrote:
Hallo,
> "http://www.domain.com/search/böse" kommt, wenn über den Firefox
Umlaute sind an jener Stelle nicht erlaubt. Damit bewegt man sich
außerhalb der Spezifikation und erhält zwangsläufig Probleme, we=
il
die Sachen nur noch zufällig funktionieren:
=20
HTML 4.01: B.2 Special characters in URI attribute values
=20
> abgeschickt, in der $_SERVER['REQUEST_URI'] als "/search/b%F6se" an,
> während von IE oder Opera abgeschickt es als "/search/%C3%B6se" ank=
ommt.
>=20
> Wie kann ich jetzt per Skript erkennen, ob der REQUEST_URI UTF-8 oder=
> anders (ISO-8859) codiert ist?
urldecode() anwenden. Nach der typischen UTF-8 Signatur schauen
(müsste eigentlich auch mit mb_detect_encoding() gehen?)
=20
http://www.w3.org/International/questions/qa-forms-utf-8
=20
oder einen Kanarienvogel mitschicken
=20
A Canary Trap for URI Escaping
http://www.onlamp.com/pub/a/onlamp/2006/02/23/canary_trap.ht ml
Die URL schon selbst url_encode(d) ausliefern.
=20
tschuess
[|8:)
Re: Encoding von REQUEST_URI erkennen
am 11.08.2006 10:58:09 von Gerald Plessner
Carsten Wiedmann schrieb:
> Mit Umlauten in URI's wird es eigentlich erst spannend, wenn man
> tatsächlich direkt Dateien mit einem Umlaut im Namen aufrufen will...
Das stimmt :-) Interessanter Weise bringt bei meiner Installation bereits
der Apache 2.0 einen "403 Forbidden" beim Aufruf von www.domain.de/böse.html
während der IE und Opera soweit kommen, dass der Apache den Request an PHP
weiterreicht und ich es per Skript abfangen und konvertieren kann. Beim
Aufruf von www.domain.de/wiki/böse.html hingegen komme ich bei beiden bis zu
PHP. Haben ein mod_rewrite von allen URIs außer Bildern und Stylesheets auf
die index.php. Die Frage gehört eigentlich in die Apache-Group, aber
vielleicht hast Du ja einen Tipp :-)
>> Wie kann ich jetzt per Skript erkennen, ob der REQUEST_URI UTF-8 oder
>> anders (ISO-8859) codiert ist? Die PHP-eigenen Erkennungsfunktionen wie
>> mb_detect_encoding() etc. funktionieren hier nicht, da der REQUEST_URI
>> ein URL-encoded ASCII-String ist.
>
> | mb_detect_encoding(urldecode($_SERVER['REQUEST_URI']), 'UTF-8,
> ISO-8859-1')
Super, hat gefunzt. Das muss ich vorher wohl was falsch gemacht haben.
Danke.
Gerald
Re: Encoding von REQUEST_URI erkennen
am 11.08.2006 19:02:06 von Carsten Wiedmann
Gerald Plessner schrieb:
> Carsten Wiedmann schrieb:
>
> > Mit Umlauten in URI's wird es eigentlich erst spannend, wenn man
> > tatsächlich direkt Dateien mit einem Umlaut im Namen aufrufen will...
>
> Das stimmt :-) Interessanter Weise bringt bei meiner Installation bereits
> der Apache 2.0 einen "403 Forbidden" beim Aufruf von
> www.domain.de/böse.html während der IE und Opera soweit kommen, dass
> der Apache den Request an PHP weiterreicht und ich es per Skript
> abfangen und konvertieren kann. Beim Aufruf von
> www.domain.de/wiki/böse.html hingegen komme ich bei beiden bis zu PHP.
> Haben ein mod_rewrite von allen URIs außer Bildern und Stylesheets auf die
> index.php. Die Frage gehört eigentlich in die Apache-Group, aber
> vielleicht hast Du ja einen Tipp :-)
Interessant... Bevor ich hier weitermache würde mich eines interessieren:
Bei einem einfachen Script mit der Endung ".php" und ohne mod_rewrite,
kannst du da das Script auch noch ohne (PHP-) Fehler im IE/Opera aufrufen?
Wie ist PHP bei dir eingebunden?
Gruß
Carsten
Re: Encoding von REQUEST_URI erkennen
am 17.08.2006 18:02:12 von Oliver Block
Gerald Plessner wrote:
> Hi,
>
> folgendes Problem: IE und Opera encoden einen Request automatisch in
> UTF-8, Firefox allerdings per Default nicht (kann über "about:config"
> geändert werden, ist aber eben nicht Standardeinstellung).
M.E. kannst Du das über den Zeichensatz der Seite steuern.
liefert z.B. für die Eingabe 'Gerücht' in einem Formular
während der folgende Eintrag im HTML-Kopf einer Seite
folgende URL
erzeugt.
Ansonsten schau Dir vielleicht mal RFC3987 unter
an. Da sollte es beschrieben sein.
Gruß,
Oliver
--
Leben ist mehr als schneller - weiter - höher