urlencode / decode
bert
- php
Hi,
ich habe eine aus eine MySQL DB generierte Navigation. Die Datenbank enthält Einträge in utf8 (zB "Tipps & Tricks"). Die Einträge werden mit urlencode() ausgegeben, damit Links in folgenderweise entstehen: /de/Tipps+%26+Tricks (alle Links beginnen mit /de/
Meine RewriteEngine leitet jede URL weiter an index.php?path=URI
RewriteRule ^de/(.*) /index.php?path=$1 [QSA,L]
Wenn ich nun die URI auslese und nach "/" explode wird allerdings nur "Tipps" ausgegeben und nicht "Tipps & Tricks":
unset($path_array);
$path_array = array();
$path_array = explode('/', urldecode($_GET["path"]));
if ($path_array[count($path_array)-1] == "")
array_pop($path_array);
Habe es mit und ohne urldecode() versucht, ohne Erfolg.
Kann mir jemand sagen, woran das liegt?
Danke und Gruß
Hi!
unset($path_array);
$path_array = array();
$path_array = explode('/', urldecode($_GET["path"]));
Diese ersten beiden Zeilen sind überflüssig. Solange der Delimiter ('/' in deinem Fall) nicht leer ist, erzeugt explode() immer ein Array und die Variable wird auch immer angelegt oder komplett überschrieben.
Wenn ich nun die URI auslese und nach "/" explode wird allerdings nur "Tipps" ausgegeben und nicht "Tipps & Tricks":
Dein geposteter Code enthält keinerlei Ausgabe, ist also nicht nachvollziehbar.
if ($path_array[count($path_array)-1] == "")
array_pop($path_array);
Wenn du überflüssige, leere Felder entfernen möchtest, so ist es einfacher, die äußeren '/' mittels trim() zu entfernen, bevor du explodierst.
Kann mir jemand sagen, woran das liegt?
Was steht wirklich in $_GET["path"]? Bitte mit var_dump() nachschauen, und wenn das vollständig ist, wie sieht deine Ausgabe aus. Dort bitte auch in die Quelltextansicht des Browsers schauen.
Lo!
Erstmal danke für die Tipps!
Was steht wirklich in $_GET["path"]? Bitte mit var_dump() nachschauen, und wenn das vollständig ist, wie sieht deine Ausgabe aus. Dort bitte auch in die Quelltextansicht des Browsers schauen.
Scheint ein Problem der RewriteEngine zu sein, da der Teil ab dem "%" nicht mehr in $path enthalten ist.
Die URI "/de/Tipps+%26+Tricks" wird also mittels "RewriteRule ^de/(.*) /index.php?path=$1 [QSA,L]" übergeben als "Tipps "
Also kein PHP, sondern ein RewriteEngine-Problem...
Hi!
Was steht wirklich in $_GET["path"]?
Scheint ein Problem der RewriteEngine zu sein, da der Teil ab dem "%" nicht mehr in $path enthalten ist.
Jein (vermutlich). Was kommt bei PHP an? Die phpinfo()-Ausgabe im unteren Teil ($_SERVER-Inhalt) wäre interessant. Ich nehme an, dass dort ein & zu sehen ist, und PHP das als Parametertrenner ansieht, woraufhin es $_GET entsprechend füllt.
Die URI "/de/Tipps+%26+Tricks" wird also mittels "RewriteRule ^de/(.*) /index.php?path=$1 [QSA,L]" übergeben als "Tipps "
Ich nehme an, gelesen zu haben, dass mod_rewrite die Escape-Sequenzen auflöst, bevor es ans Auswerten geht. Laut Apache-Dokumentation zu RewriteRule gibt es das Flag NE, das sich mit der Problematik beschäftigt. Allerdings sollte die Zeichen kodieren, wenn es nicht gesetzt ist. Anscheinend lässt es jedoch & unberührt, da das ja auch als Parametertrenner verwendet wird. Es ergibt sich nämlich das Problem, dass ein %26 nach dem Auflösen nicht mehr von einem Parametertrenner-& unterschieden werden kann.
Momentan fällt mir nicht ein, wie dieses Problem gelöst werden kann.
Lo!
Mahlzeit,
Momentan fällt mir nicht ein, wie dieses Problem gelöst werden kann.
Aber mir: Mit einer besser durchdachten Projektverwaltung.
Horst Haselhuhn
Oder das & Zeichen vor dem URLencode zusätzlich als HTML Entity encoden? -> &
Hi!
Oder das & Zeichen vor dem URLencode zusätzlich als HTML Entity encoden? -> &
Dann hast du da ein &, dass vom URL-Encode zu %26amp%3B gemacht wird. Das mod_rewrite löst das wieder zu & auf, woraufhin das & wieder als Parametertrenner erkannt wird, wodurch du nichts gewonnen hast. Nur ein amp; steht jetzt noch zusätzlich drin.
Lo!
Hi,
Ich nehme an, gelesen zu haben,
Ich nehme an, du meinst, dich erinnern oder entsinnen zu können? :-)
Momentan fällt mir nicht ein, wie dieses Problem gelöst werden kann.
Vielleicht, in dem man das Flag
'B' (escape backreferences)
also quasi das „Gegenstück” zum genannten NE, benutzt.
MfG ChrisB