2010-02-09 6 views
7

GELöST:Wie kann ich "/" durch GET in URI übergeben?

Diese URI funktioniert:

/controller/action?ret=%2F 

ich einen zusätzlichen "/" Parameter an die Controller-Aktion übergeben werden soll. Also tat ich dies:

$par1 = urlencode('/'); 
$this->_redirect('/controller/action/par1/' . $par1); 

Aber ich bekomme diese Fehlermeldung:

Not Found 

The requested URL /controller/action/ret// was not found on this server. 

Wenn ich die Controller-Aktion aufrufen ohne Parameter oder mit dem Parameter „aaa“ es funktioniert. Diese URIs arbeiten:

/controller/action 
/controller/action/par1/aaa 
/controller/action/par1/jfhsdajkhfui454fs 
/controller/action/par1 
/controller/action/par1/ 

Sie http://example.com vor allen relativen URIs stellen kann oben und es ist das gleiche.

Antwort

9

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.

+0

Ich schaffte es tatsächlich, dies zu lösen, indem URI wie folgt verwendet:/controller/action? Ret =% 2F :) –

+0

Sehr informative Antwort, Bobince.Die Option AllowEncodedSlashes configure war mir nicht vertraut. –

2

Versuchen Sie %2F. Ich glaube nicht urlencode wird '/' kodieren, weil es gültige URL-Syntax ist.

[Edit]: Ich bin dankbar für die Stimmen, aber es scheint, meine Antwort ist falsch. Siehe bobince's korrekte (und viel detailliertere) Antwort unter oben.

+0

'urlencode' codiert'/'. – bobince

Verwandte Themen