Angenommen, meine Beispiel-URL lautet
und ich sage, ich habe die folgende Route
app.get('/one/two', function (req, res) {
var url = req.url;
}
Der Wert von url
wird sein /one/two
.
Wie erhalte ich die vollständige URL in Express? Im obigen Fall möchte ich zum Beispiel erhalten http://example.com/one/two
.
Antworten:
Das Protokoll ist verfügbar als
req.protocol
. Dokumente hierhttp
wenn Sie sehen , dassreq.get('X-Forwarded-Protocol')
festgelegt ist und den Werthttps
, in welchem Fall Sie wissen , das ist Ihr ProtokollDer Gastgeber kommt von,
req.get('host')
wie Gopal angegeben hatHoffentlich benötigen Sie keinen nicht standardmäßigen Port in Ihren URLs, aber wenn Sie ihn kennen müssten, hätten Sie ihn in Ihrem Anwendungsstatus, da er
app.listen
beim Start des Servers übergeben wurde. Im Fall der lokalen Entwicklung jedoch auf einem Nicht-Standard - Port, scheint Chrome den Port in den Host - Header so enthaltenreq.get('host')
kehrtlocalhost:3000
, zum Beispiel. Zumindest für den Fall, dass sich eine Produktionsstätte an einem Standardport befindet und direkt zu Ihrer Express-App navigiert (ohne Reverse-Proxy),host
scheint der Header in Bezug auf den Port in der URL das Richtige zu tun.Der Pfad kommt von
req.originalUrl
(danke @pgrassant). Beachten Sie, dass dies die Abfragezeichenfolge enthält. Dokumente hier auf req.url und req.originalUrl . Abhängig davon, was Sie mit der URL tun möchten,originalUrl
kann dies im Vergleich zu der richtige Wert sein oder auch nichtreq.url
.Kombinieren Sie diese alle zusammen, um die absolute URL zu rekonstruieren.
quelle
req.get('Host')
stattdessenreq.host
den Host plus den Portabschnitt.host
Parameter in den Anforderungsheadern kann gefälscht werden. Es gibt einen möglichen "Host-Header-Angriff", wenn Sieres.host
diese Methode verwenden. Im Django-Framework verfügen sie über eine Variable "Zulässige Hosts", mit der ein solcher Angriff verhindert wird. Ich verwende eine Konfigurationsvariable, die mir zur Vervollständigungroot_url
hinzugefügt werden kannreq.url
. Über den Angriff: skeletonscribe.net/2013/05/…req.originalUrl
ohne Parameter hinzufügen möchten , tun Sie dies einfachreq.originalUrl.split("?").shift()
. Quelle: stackoverflow.com/a/32118818/2037431Anstatt die Dinge selbst zu verketten, können Sie stattdessen die node.js-API für URLs verwenden und
URL.format()
die Informationen von express übergeben.Beispiel:
quelle
req.get('host')
gibt der nur den Hostnamen- Teil zurück, nicht den Port. Ich weiß nicht warum, aber jetzt sammle ich die Portnummer aus den Einstellungen und verwendehostname
stattdessen das Feldhost
.pathname
meine ich, du meinstpath
. Welches beinhaltet Suche / QuerystringIch fand es ein bisschen wie eine PITA, die angeforderte URL zu bekommen. Ich kann nicht glauben, dass es keinen einfacheren Weg im Express gibt. Sollte nur req.requested_url sein
Aber so stelle ich es ein:
quelle
req.port
? Es ist nicht in der Express-Dokumentation?req.app.settings.port
Verwenden von url.format :
Dies unterstützt alle Protokolle und enthält die Portnummer. Wenn Ihre originalUrl keine Abfragezeichenfolge enthält, können Sie diese sauberere Lösung verwenden:
Wenn Sie eine Abfragezeichenfolge haben:
quelle
Hier ist eine großartige Möglichkeit, eine Funktion hinzuzufügen, die Sie für das req-Objekt aufrufen können, um die URL abzurufen
Jetzt haben Sie eine Funktion, die Sie bei Bedarf aufrufen können.
quelle
Damit req.host/req.hostname wirksam wird, müssen zwei Bedingungen erfüllt sein, wenn Express hinter Proxys ausgeführt wird :
app.set('trust proxy', 'loopback');
in app.js.X-Forwarded-Host
Der Header muss von Ihnen im Webserver angegeben werden. z.B. Apache, NginxNginx :
Apache :
quelle
127.0.0.1
vonreq.get('host')
Benutze das,
quelle
oder
quelle
Sie müssen es mit konstruieren
req.headers.host + req.url
. Natürlich, wenn Sie in einem anderen Port hosten und so kommen Sie auf die Idee ;-)quelle
req.protocol
Ich würde vorschlagen, originalUrl anstelle von URL zu verwenden:
Die Beschreibung von originalUrl finden Sie hier: http://expressjs.com/api.html#req.originalUrl
In unserem System machen wir so etwas, daher ist originalUrl für uns wichtig:
blah_controller sieht folgendermaßen aus:
Unsere URLs haben also das Format:
Daher benötigen wir req.originalUrl im Bar-Controller-Get-Handler.
quelle
Mein Code sieht so aus,
params['host_url'] = req.protocol + '://' + req.headers.host + req.url;
quelle
Ich benutze das Knotenpaket 'url' (npm install url)
Was es tut, ist, wenn Sie anrufen
Es gibt Ihnen die Möglichkeit, die URL ganz oder teilweise abzurufen. Weitere Informationen hier: https://github.com/defunctzombie/node-url
Ich habe es folgendermaßen verwendet, um alles, was nach dem / in http://www.example.com/ kommt , als Variable zu verwenden und ein bestimmtes Profil aufzurufen (ähnlich wie Facebook: http: //www.facebook). com / Benutzername )
Damit dies funktioniert, müssen Sie Ihre Route in der Datei server.js folgendermaßen erstellen:
Und stellen Sie Ihre Routendatei folgendermaßen ein:
quelle
Sie können diese Funktion auf dieser Route verwenden
req.protocol
gibt Ihnen http oder https,req.headers.host
gibt Ihnen den vollständigen Hostnamen wie www.google.com,req.originalUrl
gibt den RestpathName
(in Ihrem Fall/one/two
)quelle
Vielen Dank für diese Informationen. Das ist unglaublich nervig.
Fügen Sie dies Ihrem Code hinzu und Sie müssen nie wieder darüber nachdenken:
Sie können dort auch andere Dinge tun oder festlegen, z. B. An der Konsole protokollieren.
quelle
Nur der folgende Code hat mir gereicht!
quelle