Gibt es eine Möglichkeit, $ c-uri_for in Catalyst zu zwingen, einen URI zu erzeugen, der mit https beginnt?

8

Ich habe eine Webanwendung mit Catalyst geschrieben, die viele Formulare enthält und über https ausgeführt werden muss. Es gibt keine fest codierten URLs, alles verwendet $c->uri_for oder $c->req->uri . In der Entwicklungsumgebung funktionierte alles super, indem der Dev-Server über http lief.

Heute, als ich die Anwendung implementiert habe, ist mir ein Problem aufgefallen. So wie unsere Produktionsumgebung derzeit eingerichtet ist, sprechen Client-Browser über HTTPS mit einem F5-Lastenausgleich und der F5 spricht über HTTP mit dem Webserver im internen Netzwerk.

  

[Browser] --- HTTPS --- & gt; [F5] --- HTTP --- & gt; [Webserver]

Da der Webserver nur HTTP -Anfragen erhält, werden alle URIs beginnend mit HTTP generiert. Das bedeutet:

%Vor%

wird zu:

%Vor%

und jetzt beschweren sich alle Browser darüber, dass Sie Daten über eine unsichere Verbindung übermitteln. Ich brauche das c.uri_for , um mit https zu beginnen.

Die App musste heute online gehen, also habe ich eine Massensuche / -ersetzung für alle Formularaktionen durchgeführt:

%Vor%

Nun, das bricht die Entwicklung, also habe ich die Formularaktionen basierend auf einem Konfigurationsschlüssel konditioniert:

%Vor%

Es ist unnötig zu sagen, dass dies auf mehreren Ebenen einfach falsch scheint. Hat jemand eine bessere Idee? Und gibt es eine Möglichkeit, $c->uri_for zu zwingen, einen URI zu erzeugen, der mit https beginnt?

Lösung

Wenn Sie Catalyst 5.80008 oder höher verwenden, setzen Sie MyApp->config(using_frontend_proxy => 1); und lassen Sie einfach Ihren Proxy den Header X-Forwarded-Port setzen. Setzen Sie für Catalyst-Versionen vor 5.80008 immer noch using_frontend_proxy , damit Sie den tatsächlichen client_ip erhalten. Um jedoch die richtigen URIs zu generieren, muss Ihr Webserver die Umgebungsvariable HTTPS auf ON

setzen     
mhchaudhry 03.11.2009, 02:10
quelle

3 Antworten

11

Sie könnten diese Konfigurationsoption versuchen:

%Vor%

Es ist in der Catalyst-Dokumentation

beschrieben     
zakovyrya 03.11.2009, 04:07
quelle
5

Folgendes funktioniert (getestet):

Fügen Sie in MyApp.pm die folgende Untergruppe hinzu:

%Vor%

Jetzt können Sie jederzeit, wenn Sie eine garantierte https möchten, $c->secure_uri_for('whatever')

aufrufen     
singingfish 03.11.2009 03:50
quelle
1

Ich verwende Catalyst nicht, aber die Dokumente für uri_for zeigen auf Die base Methode des Anfrageobjekts .

Ich habe die Quelle gelesen und festgestellt, dass base eine Lese- / Schreibmethode ist. Also solltest du $req->base('https://foo.bar.com/') irgendwo in deinen Code drücken können, um deine https uris zu bekommen.

Aktualisierung:

singingfish sagt, dass der obige Rat falsch ist - was mich überhaupt nicht überraschen würde, basierte auf einem kurzen Blick auf TFM. Er / Sie sagt auch, dass stattdessen die Methode scheme eingestellt werden sollte. Ich nehme an, er bezieht sich auf die Methode scheme des Objekts uri .

Weitere Suche nach HTTPS Tricks im Catalyst Wiki . Es zeigt ein Beispiel für das Festlegen des Schemas für die Objekte uri , die von der Methode uri_for_action zurückgegeben werden. Es sieht so aus, als müssten Sie das Schema für jedes von Ihnen angeforderte URI festlegen. Also kann ich nicht anders, als zu fühlen, dass die Schema-Methode nicht die beste Wahl ist.

Ich fand auch diesen Thread in der Mailingliste . Das Festlegen von base oder das Setzen einer Umgebungsvariablen sind beide empfohlene Methoden.

Dies gibt Ihnen mehrere Möglichkeiten der Untersuchung. Viel Glück.

    
daotoad 03.11.2009 02:57
quelle

Tags und Links