Holen Sie sich das Schema des aktuellen request-URL
In Ruby/Rack, ich bin in der Lage,Holen Sie sich das Schema der aktuelle request-URL aus Schema#request
. Jedoch, im Gehen, http.Anfrage.URL.Schema
einen leeren string zurück:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%#v\n", r.URL.Scheme) //Always shows empty string
}
Wie bekomme ich das Schema des aktuellen request-URL?
- Sie können prüfen
r.Proto
es zurück HTTP/1.1 oder HTTP/2 entsprechend mit der Dokumentation, aber nicht sicher, ob es wird sich ändern für HTTPS r.Proto
nurHTTP/2
wenn die Go-Anwendung wird beendet, TLS selbst, D. H. mithttp.ListenAndServeTLS()
.- Da Sie Verwendung ListenAndServe und nicht ListenAndServeTLS, Ihr Schema kann sicher angenommen werden, als http. Wenn Sie beide verwenden tls-und nicht-tls-Versionen, die Sie verwenden können, r.TLS und überprüfen Sie es auf null, um zu wissen, ob die TLS-gegründet wurde. Wenn Ihr go app läuft hinter einem reverse-proxy, es gibt praktisch keine Möglichkeit zu wissen, was das Programm war.
- deine Antwort ist wirklich die einzige WIRKLICHE gültige Antwort hier, unter Berücksichtigung viele apps laufen nun hinter webservices (wie z.B. nginx), die möglicherweise oder möglicherweise nicht beenden TLS für die app, in einer bestimmten Umgebung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen schnellen
grep
zeigt, dassr.URL.Scheme
ist nie etwas anderes als den leeren string irgendwo innet/http
. Ich persönlich denke, es sollte sein, so weit wie möglich, aber anscheinend habe ich eine Minderheiten-Meinung.Wenn Sie eröffnet eine TLS-Hörer sich mit
http.ListenAndServeTLS()
dann vermutlich kennen Sie das Schema https bereits. Sie können eine triviale middleware-handler, der fülltr.URL.Scheme
in diesem Fall.Wenn Sie hinter einem web-server, dann kann es passieren das Anfrage-Protokoll-header wie
X-Forwarded-Proto
. In diesem Fall können Sie eine Prozedur wie gorilla Handler.ProxyHeaders() füllen Sie die fehlenden Felder aus.Beispiel für den Einsatz von gorilla-mux:
Aus seiner Kommentare:
localhost ist ein spezieller Fall für
URL
Bildung. Es wird eh leer, wenn Ihr client localhost.net.http-doc-Paket:
Den Weg bis zur gewünschten url/uri-Informationen ist, um es von
http.Anfrage
direkt. Zum Beispiel:Liegt es daran, dass Sie den Zugriff auf den HTTP-server so:
in diesen Fällen auf der Grundlage von Analyse, was Sie bekommen, ist raw-die URL ist http.Anfrage.URL. warum sind Sie immer dies ist, weil Sie Zugriff auf die URL von einem relativen Pfad, also dem fehlen einer Host-oder-Schema in der URL-Objekt.
Wenn Sie wollen, um den HTTP-host, können Sie haben Zugriff auf den Host-Attribut des http.Anfrage struct. Sehen http://golang.org/pkg/http/#Request
weil es nicht direkt verfügbar, aber man kann immer noch in der Lage sein, es zu montieren: