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:
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?
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
Sie könnten diese Konfigurationsoption versuchen:
%Vor%Es ist in der Catalyst-Dokumentation
beschriebenFolgendes 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')
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.