Як отримати домен, що ініціює запит у express.js?


84

Я використовую express.js, і мені потрібно знати домен, який є джерелом дзвінка. Це простий код

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

Як отримати домен від reqабо resоб’єкта? Я маю на увазі, що мені потрібно знати, чи викликав api somesite.com або someothersite.com. Я спробував зробити console.dir і того, reqі іншого, resале я звідти не здогадувався, також прочитав документацію, але це не допомогло.


1
try: req.hostабо req.get('host') виражає документи
dc5

2
node.js: req.headers["x-forwarded-for"] || req.connection.remoteAddress x-forwarded-for охоплював би ваші бази за проксі, балансиром навантаження ...
Їжте в Joes

Я отримую це попередження: експрес-застарілий req.host: Використовуйте req.hostname замість index.js: 20: 8
Адам Ф,

Відповіді:


142

Ви повинні отримати його з HOSTзаголовка .

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

Це не обов’язково для HTTP 1.0, але вимагається 1.1. І додаток завжди може пред’явити власну вимогу.


Якщо це для підтримки запитів на перехресне походження , замість цього ви використовуєте Originзаголовок.

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

Зверніть увагу, що деякі запити про перехресне походження вимагають перевірки за допомогою запиту " перед вильотом " :

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

Якщо ви шукаєте IP-адресу клієнта, ви можете отримати це за допомогою:

var userIP = req.socket.remoteAddress;

Зверніть увагу, що якщо ваш сервер стоїть за проксі-сервером, це, швидше за все, надасть вам IP-адресу проксі-сервера. Чи зможете ви отримати IP-адресу користувача, залежить від того, яку інформацію передає проксі. Але, як правило, це також буде в заголовках.


1
Але хіба це не дає мені хоста API? Це може бути спричинено тим, що я роблю це локально, і у мене api.time.ly встановлено для вирішення до 127.0.0.1, і дзвінок, який я роблю, від localhost, але якщо я цим користуюся, хост - це "api.time.ly", мені потрібно знати домен, який мене викликає. я протестую це на веб-сайті в реальному часі.
Нікола Пелучетті

1
@NicolaPeluchetti Я думаю, я не розумію, що ви маєте на увазі під " доменом, який мене кличе ". Клієнти HTTP зазвичай не надають власне ім’я хосту у запиті. Це для CORS ?
Джонатан Лоновський

У мене є центральний api, який знаходиться на api.time.ly. Цей API називається різними веб-сайтами клієнтів, які встановлюють наш плагін WordPress. Тож ми могли б мати Church1.com та sauna1.com дзвонити на наш API. В API я зможу отримати, якщо дзвінок було зроблено з church1.com або з sauna1.com ? я побачив заголовок, чи 'user-agent': 'WordPress/3.6; http://localhost/wordpress_clean'слід його аналізувати?
Нікола Пелучетті

Якщо домен не передано, це не проблема, я можу додати його до виклику API очевидно.
Нікола Пелучетті

@NicolaPeluchetti Ви можете спробувати розщеплення і розбір агент користувача або вимагати його в якості даних в запиті. Але я б сказав, що щось на зразок OAuth було б більш підходящим для ідентифікації клієнтів.
Джонатан Лоновський

38

Замість:

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

Ви також можете використовувати:

var host = req.headers.host;
var origin = req.headers.origin;

8
отриманняundefined
Himanshu Bansal

дає мені 127.0.0.1:3000
user1709076

8

У Express 4.x ви можете використовувати req.hostname, який повертає доменне ім'я, без порту. тобто:

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

Див .: http://expressjs.com/en/4x/api.html#req.hostname


8
Це повертає ім’я хосту сервера, на який ви отримуєте запит. Це буде працювати, лише якщо ви працюєте з API та веб-сайтом на одному сервері, а сторона, що приймає та отримує, однакова.
Paul T. Rawkeen

0

Нещодавно зіткнувся з проблемою отримання заголовка запиту "Origin", тоді я знайшов це питання. Але досить переплутаний з результатами, req.get('host')є застарілим, ось чому дає Undefined. Використовувати,

    req.header('Origin');
    req.header('Host');
    // this method can be used to access other request headers like, 'Referer', 'User-Agent' etc.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.