Sie sind es fast richtig zu machen. Der einzige kleine Fehler ist, dass urlencode
es vorziehen wird, ein Plus zu verwenden, um ein Leerzeichen anzugeben, das nur in Abfrageparametern und nicht Pfadteil geeignet ist. rawurlencode
wäre hier besser.
Das ist jedoch nicht der Grund, warum es nicht funktioniert. Sie erzeugen bereits den Pfad /controller/action/par1/%2F
, der korrekt ist.
Es funktioniert nicht in der Praxis für Sie, weil Apache versucht, Sie (in einer eher ineffektiven Weise) vor Verzeichnis-Traversal-Problemen zu schützen. Wenn Sie eine %2F
Sequenz in einen URL-Pfad einschließen, springt Apache standardmäßig ein und zeigt Ihre eigene 404-Seite an (alle Errordocument-Einstellungen werden ignoriert). Um diese Funktion (IMO: falsefeature) auszuschalten, können Sie die Konfigurationsrichtlinie AllowEncodedSlashes verwenden.
Ob Sie tatsächlich den codierten Schrägstrich abrufen können, wenn er zu Ihrem Skript zurückkommt, ist eine weitere Würmer-Dose. Aufgrund des schlechten Designs der PATH_INFO
Variable in der ursprünglichen CGI-Spezifikation, werden viele Umgebungen die %2F
nicht als etwas anderes als ein unverschlüsseltes /
sehen können, was möglicherweise das Routing, das Sie tun, aus Pfadteilen unterbricht.
Es ist normalerweise am besten, Schrägstriche in Pfadteilen zu vermeiden, da Apache nicht der einzige Server oder die einzige Sprache ist, die von ihnen verwirrt wird. Im Allgemeinen sollten Sie Abfrageparameter für die Eingabe verwenden, in denen Sie eine beliebige Zeichenfolge oder Bytes akzeptieren müssen, da Pfadteile in vielen Servern mit (a) /
, (b) \
, (c) dem NUL-Zeichen praktische Probleme haben und (d) leere Zeichenfolgen.
Ich schaffte es tatsächlich, dies zu lösen, indem URI wie folgt verwendet:/controller/action? Ret =% 2F :) –
Sehr informative Antwort, Bobince.Die Option AllowEncodedSlashes configure war mir nicht vertraut. –