2016-04-03 17 views
4

Ich habe einen einfachen Web-basierten E-Mail-Client wie Google Mail erstellt. Ich möchte Bilder anzeigen, aber um es mit meiner ssl-Seite zu machen, müssen alle Bilder über ssl bedient werden (sonst erhalte ich "Mixed-Content" -Warnungen). Also brauche ich einen Reverse-Proxy wie Gmail diese Bilder liefern muss.Einfache Reverse-Proxy für die Bereitstellung von Bildern über ssl

Ich werde alle Bild-URLs in der E-Mail umschreiben, um auf den Reverse-Proxy zu zeigen. Zum Beispiel:

Mein Reverse-Proxy ist https://myreverseproxy.com

Originalbild url http://stuff.com/image1.jpg

ich die URL neu schreiben wird https://myreverseproxy.com?image-url=http://stuff.com/image1.jpg

Wenn der Reverse-Proxy wird die Anforderung "https://myreverseproxy.com?image-url=http://stuff.com/image1.jpg" sein wird es bekommen die Originalbild aus dem Abfrageparameter image-url (http://stuff.com/image1.jpg), holen Sie das Bild und geben Sie es an den Requester https://myreverseproxy.com?image-url=http://stuff.com/image1.jpg zurück.

Gibt es irgendwelche Dienste, die das sofort machen? Könnte ich eine einfache schreiben? Gibt es dafür bereits Bibliotheken oder Lösungen, die ich einfach irgendwo installieren könnte?

Ich bin offen für jede Sprache und jede Plattform ... Ich will nur dieses Problem gelöst.

+0

FYI, Sie können einen Webserver einrichten, z. Apache oder Nginx als Reverse-Proxy. Wenn Sie mehr Flexibilität benötigen, verwenden Sie HAProxy. Guides für all diese können leicht gefunden werden. Führen Sie sie getrennt von Ihrer Anwendung aus und fügen Sie zur Sicherheit eine Sitzung/Token-Authentifizierung hinzu. –

+0

Als Nebenbemerkung - Sie können Bild in E-Mail einbetten, anstatt einen Bildserver zu verwenden, die meisten E-Mail-Clients, wenn nicht alle, würden den Bildlink standardmäßig blockieren, es sei denn, die Empfangsbestätigung weist den Absender auf. Wenn E-Mails an externe Parteien gesendet werden, spart dieser Ansatz Ihre Kosten für die Bandbreite, wenn sie die E-Mail mehr als einmal lesen. – Hang

+0

Dank @Hang. Dies ist nur für eingehende E-Mails (außerhalb meines Systems). Wenn wir E-Mails verschicken, tauschen wir die Bild-URLs wieder auf ihr Original aus, so dass niemand außerhalb unseres Reverse-Proxys schlägt. In der Tat werden wir es nach IP sperren. – richard

Antwort

8

Ich würde das gleiche wie Tudor vorschlagen: ein Proxy in Knoten geschrieben.

Allerdings würde ich empfehlen, eine breiter verwendete und getestete Bibliothek wie node-http-proxy zu verwenden. Es ist wirklich einfach zu installieren, und wird erreichen, was Sie in weniger als 20 Zeilen Code benötigen.

var httpProxy = require('http-proxy') 

httpProxy.createServer({ 
    target: { 
    host: 'stuff.com', 
    port: 80 
    }, 
    ssl: { 
    key: fs.readFileSync('./ssl-key.pem', 'utf8'), 
    cert: fs.readFileSync('./ssl-cert.pem', 'utf8') 
    } 
}).listen(443); 

Wenn ein Kunde dann greift https://reverseproxy.com/image.png, würde der Prozess wie folgt

enter image description here

Ich habe in diesem Schema, das die Reverse-Proxy läuft auf einem anderen Server als der Webserver angenommen dient die Bilder, aber das muss nicht der Fall sein. Wenn beide auf demselben Server laufen, verwenden Sie einfach host: 'localhost' im Bereich target.

-

Für den Fall, Sie sind mit Knoten nicht vertraut sind, ist hier, was Sie tun müssen schnell dieses Setup auszuführen.

  • Installieren Knoten
  • eine neue Datei erstellen Sie den Code in yourprojectpath/index.js
  • Generieren Sie eine package.json Datei, indem Sie enthält npm init in Ihrem Projektverzeichnis
  • Run npm install --save http-proxy die Installation http-proxy Bibliothek und in der Lage sein, es im Code

zu verwenden Sie sollten jetzt in der Lage sein, die Reverse-Proxy von

node index.js 

laufen Wenn Sie sich mit dieser in der Produktion planen, empfehle ich Ihnen einen Blick auf PM2 nehmen. Es ist ein Prozess-Manager für Knoten, die im Grunde gewährleistet, dass Ihre Anwendung immer ausgeführt wird, egal was. Insbesondere wird es neu gestartet, wenn irgendeine Art von Ausnahme von der Anwendung ausgelöst wird und sie hätte beendet werden müssen.

Installation:

npm install -g pm2 

Verbrauch:

pm2 start index.js 

Noch ein paar Anmerkungen:

  • stellen Sie sicher, dass Ihre .pem Dateien entsprechenden Berechtigungen und Eigentümer haben. chmod 400 ist normalerweise eine gute Option (nur vom Eigentümer lesbar). Der Benutzer, der die Node-Anwendung ausführt, sollte sie jedoch lesen können.
  • Wenn Ihr Server hinter einer (Software- oder Hardware-) Firewall ausgeführt wird, müssen Sie möglicherweise den Port 443 für eingehenden Datenverkehr öffnen
  • Abhängig von Ihrem SSL-Zertifikatsanbieter müssen Sie möglicherweise die Dateien konvertieren, die er Ihnen bereitstellt PEM-Format
  • , wenn nötig, Knoten-http-Proxy unterstützt additional options wie das Hinzufügen von Header, wenn eine Anforderung proxied wird
  • das Skript, das ich oben dargestellt wird vorausgesetzt, Sie haben ssl-key.pem und ssl-cert.pem im selben Verzeichnis wie es

Hoffnung das hilft! Und fragen Sie einfach, ob Ihnen etwas unklar erscheint

+0

danke! "Ich habe in diesem Schema angenommen, dass der Reverse-Proxy auf einem anderen Server läuft als der Webserver, der die Bilder bereitstellt" Ja, das ist der Fall. In der Tat werden diese Bilder aus dem ganzen Web kommen. Ich verwende den Reverse-Proxy, um http-gehostete Bilder über https abzurufen, so dass mein Web-E-Mail-Client sich nicht über gemischte Inhalte beschweren wird (siehe meine Frage). Wird das noch funktionieren? – richard

+0

Ich plane, dies in azurblau zu veranstalten ... irgendwelche Probleme oder Dinge, die ich beachten sollte? – richard

2

Hier ist, wie selbstsignierte Zertifikate zu erstellen, wenn Sie irgendeine

haben keine

Nodejitsu docs

Jetzt für den Code, der in node.js geschrieben:

HTTPS proxy

... und ein Screenshot :)

screenshot

+0

Danke! Wir haben Zertifikate gekauft und benötigen noch eine weitere für diese Subdomain. Also ist dieser Code ein https-Proxy, der im Knoten geschrieben ist? Wow ... Ich werde es mir ansehen! – richard

0

Es kann leicht mit Nginx getan werden. Btw, es kann getan werden, wie Sie fragen, und es ist auch möglich, URLs genau wie Ursprungsurl zu machen. Zum Beispiel cdn.xxx.com/img.jpg - www.xxx.com/img.jpg.

0

Richard, Sie können das Problem von gemischten Inhalten leicht lösen, indem Sie CORS in nginx Konfigurationsdatei aktivieren, hier ist ein Beispiel http://enable-cors.org/server_nginx.html. In diesem Fall ist es für jeden verfügbar, Sie können für eine bestimmte Domäne oder IP-Adresse festlegen, müssen Sie genauer suchen.