2010-10-14 13 views
5

Ich teste meine Zend Framework-Anwendung mit Selenium und PHPUnit. Ich habe einen Test, der eine URL öffnen muss, die eine codierte URL enthält.Zend Framework: Apache dekodierte URL statt codierte URL übergeben?

$redirectToLocation = urlencode('/myothercontroller/action'); // %2Fmyothercontroller%2Faction 
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation); 

Aber wenn ich meinen Test durchgeführt, der Browser versucht, die dekodiert URL öffnen:

/controller/action/thenRedirectTo//myothercontroller/action 

Was soll ich tun Selen bekommen die kodierte URL zu öffnen?

Update: Eigentlich ... stellt sich heraus, Selen tut es die Aufgabe, aber es scheint, als ob Apache die URL decodiert, bevor es an die Steuerung bekommt:

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

Wie nehme ich dieses Problem beheben ?

Update: Hier ist eine ganze Konversation über das gleiche Problem, das ich habe: http://old.nabble.com/URL-Encoding-td18850769.html. Ihr Workaround bestand darin, die URL zu codieren, aber das ist nicht gut genug für mich. Ich kann diese Lösung kurzfristig verwenden, aber ich möchte wissen, was die eigentliche Ursache für dieses Problem ist, damit ich es beseitigen kann.

Update: Ich habe einen Kollegen, der denkt, dass es ein Problem mit der Art und Weise gibt, wie Zend Framework die Anfrage leitet. Denkst du, dass das der Fall sein könnte?

Antwort

0

Interessantes Problem. Ich persönlich hatte nie Probleme, eine andere URL in einer Abfragezeichenfolge zu übergeben, dh/controller/action/thenRedirectTo? Q =% 2Fmyothercontroller% 2Faction, aber ich habe Apache schon lange nicht mehr verwendet, und das ist nicht genau das, was Sie Ich versuche es zu tun.

Eine mögliche Lösung könnte doppelte URL-Codierung sein.

$redirectToLocation = urlencode(urlencode('/myothercontroller/action')); 
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation); 

Vielleicht Apache wird nur url dekodieren es eine Ebene.

+1

Habe das nicht versucht, aber es könnte funktionieren. Allerdings würde ich Apache lieber richtig einstellen, anstatt meinen Code zu hacken. – Andrew

+0

Es ist ein hässlicher Workaround. Ich stimme zu, dass Apache sich nicht damit anlegen sollte. Sicherlich ist das irgendwie konfigurierbar? – mcv

0

Ich habe dieses Verhalten vor und es war mod_rewrite, die die Decodierung tat. Soweit ich weiß, ist der einzige Weg, um es zu umgehen urlencode der Teil der Anfrage URL, die Sonderzeichen zweimal erhalten müssen.

0

Sie sollten Ihre mod_rewrite im Debug-Modus in Apache setzen und schauen, was er tut:

RewriteEngine on 
RewriteLog /tmp/rewrite.log 
RewriteLogLevel 9 

und zeigen Sie uns Ihre ZF Regeln neu schreiben. Es basiert ganz sicher auf% {QUERY_STRING}, was die kompiliert dekodierte URL ist. Wir könnten versuchen, es mit% {THE_REQUEST} zu überarbeiten, was die nicht decodierte URL ist. Das Beste wäre,% {THE_REQUEST} nur für den richtigen Controller zu behandeln.

Eine andere Lösung könnte die Verwendung der base64-Codierung in der URL sein, so dass mod_rewrite und andere Tools sie niemals als URL-Informationen abfangen würden.

Eine andere Sache zu prüfen ist die [B] auf mod_rewrite, wie hier erklärt: How to encode special characters using mod_rewrite & Apache?. Aber ich frage mich, ob ich die Regel zum Umschreiben nicht brechen würde.

0

Es sieht so aus Zend Framwork issue bezieht sich auf Ihr Problem. Um zu überprüfen, öffnen Sie Zend/Controller/Request/Http.php und entfernen Sie die URL-Code Funktionsaufrufe, aber behalten Sie die Variablen und testen Sie Ihren Code erneut.

2

Dies ist ein Apache "Feature". Kodierte Schrägstriche werden automatisch decodiert und an die Anwendung (php) gesendet. Daher wird es als ein langes URI anstelle eines URI mit einem codierten URI als Parameter erkannt.

Es ist jedoch möglich, dies auszuschalten, indem Sie AllowEncodedSlashes On in Ihrer Konfiguration verwenden. Weitere Informationen unter Apache manual. Bitte beachten Sie, dass der Kontext dieser Anweisung Serverkonfiguration und virtueller Host ist, so dass Sie ihn nicht in eine .htaccess-Datei einfügen können.

Verwandte Themen