Wie erhalte ich die Domain, von der die Anfrage stammt, in express.js?

79

Ich verwende express.js und muss die Domain kennen, von der der Anruf stammt. Dies ist der einfache Code

app.get(
    '/verify_license_key.json',
    function( req, res ) {
        // do something

Wie erhalte ich die Domain vom reqoder vom resObjekt? Ich meine, ich muss wissen, ob die API von somesite.com oder someothersite.com aufgerufen wurde. Ich versuchte , ein console.dir sowohl tun reqund , resaber ich habe keine Ahnung , von dort auch die Dokumentation lesen , aber es gab mir keine Hilfe.

Nicola Peluchetti
quelle
1
versuchen: req.hostoder req.get('host') drückt docs
dc5
1
node.js: req.headers["x-forwarded-for"] || req.connection.remoteAddress x-forwarded-for würde Ihre Basen hinter einem Proxy, Load Balancer abdecken ...
Essen Sie am
Ich erhalte diese Warnung: Express veralteter req.host: Verwenden Sie stattdessen req.hostname index.js: 20: 8
Adam F

Antworten:

134

Sie müssen es aus dem HOSTHeader abrufen .

var host = req.get('host');

Es ist optional mit HTTP 1.0, wird jedoch von 1.1 benötigt. Und die App kann immer eine eigene Anforderung stellen.


Wenn dies zur Unterstützung von Cross-Origin-Anforderungen dient , verwenden Sie stattdessen den OriginHeader.

var origin = req.get('origin');

Beachten Sie, dass einige Ursprungsanfragen eine Validierung durch eine " Preflight " -Anforderung erfordern :

req.options('/route', function (req, res) {
    var origin = req.get('origin');
    // ...
});

Wenn Sie nach der IP des Clients suchen, können Sie diese abrufen mit:

var userIP = req.socket.remoteAddress;

Beachten Sie, dass Sie wahrscheinlich die IP-Adresse des Proxys erhalten, wenn sich Ihr Server hinter einem Proxy befindet. Ob Sie die IP des Benutzers erhalten können, hängt davon ab, welche Informationen der Proxy weitergibt. Aber es wird normalerweise auch in den Headern sein.

Jonathan Lonowski
quelle
1
Aber gibt mir das nicht den Host der API? Es könnte durch die Tatsache verursacht werden, dass ich dies lokal mache und api.time.ly auf 127.0.0.1 aufgelöst habe und der Anruf, den ich mache, ist von localhost, aber wenn ich das benutze, ist host "api.time.ly". Ich muss die Domain kennen, die mich anruft. Ich werde dies auf einer Live-Site testen.
Nicola Peluchetti
1
@NicolaPeluchetti Ich glaube, ich verstehe nicht, was du mit " der Domain, die mich anruft " meinst . HTTP-Clients geben normalerweise keinen eigenen Hostnamen in der Anforderung an. Ist das für CORS ?
Jonathan Lonowski
Ich habe eine zentrale API, die sich unter api.time.ly befindet. Diese API wird von verschiedenen Client-Websites aufgerufen, die unser WordPress-Plugin installieren. So könnten Church1.com und Sauna1.com unsere API anrufen . In der API könnte ich bekommen, wenn der Anruf von church1.com oder von sauna1.com getätigt wurde ? Ich habe einen Header gesehen. 'user-agent': 'WordPress/3.6; http://localhost/wordpress_clean'Soll ich das analysieren?
Nicola Peluchetti
Wenn Domain nicht übergeben wird, ist es kein Problem, ich kann es natürlich zum API-Aufruf hinzufügen.
Nicola Peluchetti
@NicolaPeluchetti Sie können versuchen, den Benutzeragenten aufzuteilen und zu analysieren oder ihn als Daten in der Anforderung zu benötigen. Aber ich würde sagen, so etwas wie OAuth wäre besser geeignet, um Kunden zu identifizieren.
Jonathan Lonowski
35

Anstatt:

var host = req.get('host');
var origin = req.get('origin');

Sie können auch verwenden:

var host = req.headers.host;
var origin = req.headers.origin;
Michiel
quelle
8
bekommenundefined
Himanshu Bansal
gibt mir 127.0.0.1:3000
user1709076
7

In Express 4.x können Sie req.hostnameohne Port den Domänennamen zurückgeben. dh:

// Host: "example.com:3000"
req.hostname
// => "example.com"

Siehe: http://expressjs.com/de/4x/api.html#req.hostname

DiegoRBaquero
quelle
8
Dies gibt den Hostnamen des Servers zurück, auf dem Sie eine Anfrage erhalten. Es funktioniert nur, wenn Sie Ihre API und die Website auf dem gleichen Server mit Ursprung laufen und Partei empfangen die gleiche Host ist.
Paul T. Rawkeen
0

Vor kurzem gab es ein Problem beim Abrufen des 'Origin'-Anforderungsheaders. Dann fand ich diese Frage. Aber ziemlich verwirrt mit den Ergebnissen, req.get('host')ist veraltet, deshalb geben Undefined. Verwenden,

    req.header('Origin');
    req.header('Host');
    // this method can be used to access other request headers like, 'Referer', 'User-Agent' etc.
Molagbal
quelle