Ich habe eine Website, die aus drei kleineren "unabhängigen" Unterwebsites besteht:
Wo doc
eine Website ist, die mit Hugo :: Eine schnelle und moderne statische Website-Suchmaschine erstellt wurde, ist editor
die mxgraph Graphditor-Beispiel ; und die verbleibenden Dateien machen eine handgemachte Landing Page.
Neben der Bereitstellung auf einem Webserver möchte ich die Website als eigenständige Anwendung verteilen. Um dies zu erlauben, schrieb ich diesen wirklich einfachen Server in go:
%Vor% Als Ergebnis kann ich simpleserver -d <path-to-mysite>
ausführen und die Websites durch localhost
, localhost/doc
und localhost/editor
durchsuchen.
Dann möchte ich benutzerdefinierte (Sub-) Domain (s) wie mylocal.app
, doc.mylocal.app
und editor.mylocal.app
verwenden. Also habe ich die folgende Zeile zu meiner /etc/hosts
-Datei hinzugefügt: 127.0.0.1 mylocal.app
. Daher kann ich mylocal.app
, mylocal.app/editor
und mylocal.app/doc
durchsuchen. Außerdem konnte ich es mit verschiedenen Paketen in mylocal.app
, mylocal.app:<editor-port>
und mylocal.app:<doc-port>
ändern.
Wenn ich jedoch versuche, eine Subdomain zu verwenden, wird sie nicht ordnungsgemäß aufgelöst, sodass eine Reverse-Proxy-Strategie nicht funktioniert. Da Platzhalter nicht unterstützt werden, kann ich zusätzliche Einträge in der /etc/hosts
-Datei hinzufügen, aber ich würde es lieber vermeiden.
Obwohl eine alternative Lösung darin besteht, dnsmasq auszuführen, möchte ich die Anwendung als Standalone-Version beibehalten. Ich habe gleichwertige Golang-Pakete gefunden. Ich habe jedoch das Gefühl, dass viele Funktionen unterstützt werden, die ich nicht wirklich brauche.
Außerdem, da ich keine IP wirklich lösen muss, aber einen Alias von localhost
, denke ich, dass ein Proxy ausreichen könnte. Dies wäre auch einfacher zu konfigurieren, da der Benutzer nur den Browser konfigurieren könnte und keine systemweite Änderung erforderlich wäre.
Der gesamte Datenverkehr des Nutzers wird jedoch von meiner App "gefiltert". Ist das richtig? Wenn ja, können Sie mich auf jeden Hinweis verweisen, um es auf die sauberste Weise zu implementieren. Ich weiß, das ist ziemlich subjektiv, aber ich meine ein relativ kurzes (sagen wir 10 Zeilen Code) Snippet, so dass Benutzer leicht überprüfen können, was vor sich geht.
BEARBEITEN
Ich möchte etwas wie:
verwenden %Vor%oder
%Vor%Dies sind nur Schnipsel. Ein vollständiges Beispiel ist dies , auf das in den Kommentaren von @ Steve101 verwiesen wurde.
Allerdings weiß ich momentan nicht, was systemDefaultHandler ist. Und das ist dort nicht gelöst.
Abgesehen davon schlug @faraz vor, goproxy zu verwenden. Ich denke, dass HTTP/HTTPS transparent proxy
der Standard-Handler ist, nach dem ich suche. Aber mit einem Paket nur zu tun, scheint mir übertrieben. Kann ich die gleiche Funktionalität mit integrierten Ressourcen erreichen?
Leider gibt es keinen einfachen Weg, dies über Go zu tun. Sie müssen die DNS-Anfragen Ihres Systems genau wie dnsmasq abfangen, und das erfordert zwangsläufig einige Änderungen an der DNS-Konfiguration des Systems ( /etc/resolv.conf
in Linux, /etc/resolver
auf einem Mac oder Firewall-Regel), um Ihre DNS-Anfragen zu routen deine App Der DNS-Server hat den Nachteil, dass Sie einen DNS-Server in Ihrer App erstellen müssen, der pow.cx ähnlich ist scheint unnötig kompliziert.
Da das Mucken mit der Systemkonfiguration unvermeidlich ist, würde ich dafür stimmen, Änderungen an der hosts-Datei beim Booten vorzunehmen oder wenn ein Verzeichnis hinzugefügt / entfernt wird (über fsnotify .) Beim Herunterfahren können Sie auch die hinzugefügten Einträge löschen.
Wenn Sie diese Änderungen für einen bestimmten Browser isolieren möchten, anstatt eine systemweite Änderung vorzunehmen, können Sie Ihre Anwendung immer über einen Proxy-Server wie goproxy und weisen Sie Ihren Browser an, diesen Proxy für Anfragen zu verwenden. Beispielsweise können Sie dies in Chrome über seine Einstellungen oder durch Festlegen des --proxy-server
-Flags tun:
Weitere Informationen finden Sie in den Chrome-Dokumenten zu Netzwerkeinstellungen .
Wenn Sie mit Browserkonfigurationen auch viel zu tun haben, können Sie einfach verwenden eine Erweiterung , um die Anfragen nach Bedarf zu bearbeiten.
Es gibt nur eine Lösung, die ohne Proxy funktionieren würde, dass Sie eine Domain dafür registrieren und einen offiziellen DNS-Eintrag mit Platzhalter zu 127.0.0.1 wie * .myApp.suche.org machen. Also jeder Client, der die IP auflöst, bekommt 127.0.0.1 und arbeitet lokal. Auf diese Weise benötigen Sie keine Administratorrechte, um die Datei / etc / hosts oder Ähnliches zu ändern. Wenn es hinter Proxy arbeiten sollte, ohne den Resolver (etc / hosts etc) zu modifizieren, können Sie eine wpad.dat (Javascript für Proxy detection) angeben, die für Ihre Domain sagt, dass der gesamte Datenverkehr Sie Server und den Rest an den realen Proxy. Wenn dies auf Ihrem Server ausgeführt wird, kann das Skript automatisch den echten Proxy als Standard enthalten.
Tags und Links proxy go dns reverse-proxy