Discussion:
Encoding von REQUEST_URI erkennen
(zu alt für eine Antwort)
Gerald Plessner
2006-08-10 17:12:44 UTC
Permalink
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
Carsten Wiedmann
2006-08-10 19:08:13 UTC
Permalink
Post by Gerald Plessner
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).
"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...
Post by Gerald Plessner
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
Gerald Plessner
2006-08-11 08:58:09 UTC
Permalink
Post by Carsten Wiedmann
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 :-)
Post by Carsten Wiedmann
Post by Gerald Plessner
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
Carsten Wiedmann
2006-08-11 17:02:06 UTC
Permalink
Post by Gerald Plessner
Post by Carsten Wiedmann
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
Sven Drieling
2006-08-10 19:24:07 UTC
Permalink
Gerald Plessner wrote:

Hallo,
Post by Gerald Plessner
"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, weil
die Sachen nur noch zufällig funktionieren:

HTML 4.01: B.2 Special characters in URI attribute values
Post by Gerald Plessner
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?
urldecode() anwenden. Nach der typischen UTF-8 Signatur schauen
(müsste eigentlich auch mit mb_detect_encoding() gehen?)

http://www.w3.org/International/questions/qa-forms-utf-8

oder einen Kanarienvogel mitschicken

A Canary Trap for URI Escaping
http://www.onlamp.com/pub/a/onlamp/2006/02/23/canary_trap.html


Die URL schon selbst url_encode(d) ausliefern.


tschuess
[|8:)
Oliver Block
2006-08-17 16:02:12 UTC
Permalink
Post by 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).
M.E. kannst Du das über den Zeichensatz der Seite steuern.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

liefert z.B. für die Eingabe 'Gerücht' in einem Formular

<http://www.myhost.de/test_url_encoding.html?eingabe=Ger%C3%BCcht>

während der folgende Eintrag im HTML-Kopf einer Seite

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">

folgende URL

<http://www.myhost.de/test_url_encoding.html?eingabe=Ger%FCcht>

erzeugt.

Ansonsten schau Dir vielleicht mal RFC3987 unter
<http://www.ietf.org/rfc/rfc3987.txt>
an. Da sollte es beschrieben sein.

Gruß,

Oliver
--
Leben ist mehr als schneller - weiter - höher
<http://www.nak-nrw.de/p_6_4.html>

Loading...