it-swarm.com.ru

Как получить полный URL в Express?

Допустим, мой пример URL

http://example.com/one/two

и я говорю, у меня есть следующий маршрут

app.get('/one/two', function (req, res) {
    var url = req.url;
}

Значение url будет /one/two.

Как мне получить полный URL в Express? Например, в случае выше, я хотел бы получить http://example.com/one/two.

406
Chris Abrams
  1. Протокол доступен как req.protocol. документы здесь

    1. До экспресс 3.0, протокол, который вы можете считать http, если вы не видите, что req.get('X-Forwarded-Protocol') установлен и имеет значение https, и в этом случае вы знаете, что это ваш протокол
  2. Хост происходит из req.get('Host'), как указал Гопал

  3. Надеюсь, вам не нужен нестандартный порт в ваших URL-адресах, но если вам нужно знать его, вы получите его в состоянии приложения, потому что это все, что вы передали app.listen во время запуска сервера. Однако в случае локальной разработки на нестандартном порте Chrome, кажется, включает порт в заголовок хоста, поэтому req.get('Host') возвращает, например, localhost:3000. Так что, по крайней мере, в случае рабочего сайта на стандартном порте и просмотра непосредственно в вашем экспресс-приложении (без обратного прокси-сервера) заголовок Host, похоже, правильно работает с портом в URL.

  4. Путь происходит от req.originalUrl (спасибо @pgrassant). Обратите внимание, что это включает в себя строку запроса. здесь документы на req.url и req.originalUrl . В зависимости от того, что вы собираетесь делать с URL-адресом, originalUrl может быть или не быть правильным значением по сравнению с req.url.

Объедините все это вместе, чтобы восстановить абсолютный URL.

  var fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl;
631
Peter Lyons

Вместо того, чтобы объединять все вместе, вы можете вместо этого использовать API для URL-адресов node.js и передавать URL.format() информацию из express.

Пример:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    Host: req.get('Host'),
    pathname: req.originalUrl
  });
}
109
Michael Weibel

Я нашел немного PITA, чтобы получить запрошенный URL. Я не могу поверить, что нет более простого способа выразить. Должно быть просто req.requested_url

Но вот как я это установил:

var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.Host  + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
32
chovy

Используя rl.format :

var url = require('url');

Это поддерживает все протоколы и включает номер порта. Если у вас нет строки запроса в вашем originalUrl, вы можете использовать это более чистое решение:

var requrl = url.format({
    protocol: req.protocol,
    Host: req.get('Host'),
    pathname: req.originalUrl,
});

Если у вас есть строка запроса:

var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.Host = req.get('Host');
var requrl = url.format(urlobj);
17
mpolci

Вот отличный способ добавить функцию, которую вы можете вызвать в объекте req, чтобы получить URL

  app.use(function(req, res, next) {
    req.getUrl = function() {
      return req.protocol + "://" + req.get('Host') + req.originalUrl;
    }
    return next();
  });

Теперь у вас есть функция, которую вы можете вызвать по требованию, если вам это нужно.

15
lostintranslation

для того чтобы сделать req.Host/req.hostname эффективным, должно быть два условия, когда Экспресс за прокси :

  1. app.set('trust proxy', 'loopback'); в app.js
  2. Заголовок X-Forwarded-Host должен быть указан вами самостоятельно в веб-сервере. например. Apache, Nginx

Nginx :

server {
    listen myhost:80;
    server_name  myhost;
    location / {
        root /path/to/myapp/public;
        proxy_set_header X-Forwarded-Host $Host:$server_port;
        proxy_set_header X-Forwarded-Server $Host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myapp:8080;
    }
}

Apache :

<VirtualHost myhost:80>
    ServerName myhost
    DocumentRoot /path/to/myapp/public
    ProxyPass / http://myapp:8080/
    ProxyPassReverse / http://myapp:8080/
</VirtualHost>
9
zhi.yang

Использовать этот,

var url = req.headers.Host + '/' + req.url;
8
Vaghani Janak
var full_address = req.protocol + "://" + req.headers.Host + req.originalUrl;

или же

var full_address = req.protocol + "://" + req.headers.Host + req.baseUrl;
6
mlibre

Я бы предложил использовать originalUrl вместо URL:

var url = req.protocol + '://' + req.get('Host') + req.originalUrl;

Смотрите описание originalUrl здесь: http://expressjs.com/api.html#req.originalUrl

В нашей системе мы делаем что-то вроде этого, поэтому для нас важен originalUrl:

  foo = express();
  express().use('/foo', foo);
  foo.use(require('/foo/blah_controller'));

blah_controller выглядит так:

  controller = express();
  module.exports = controller;
  controller.get('/bar/:barparam', function(req, res) { /* handler code */ });

Таким образом, наши URL имеют формат:

www.example.com/foo/bar/:barparam

Следовательно, нам нужен req.originalUrl в обработчике get контроллера bar.

6
Amber Haq Dixon

Мой код выглядит так,

params['Host_url'] = req.protocol + '://' + req.headers.Host + req.url;

6
soomtong

Вы должны построить его, используя req.headers.Host + req.url. Конечно, если вы размещаете хостинг в другом порту, вы поймете идею ;-)

6
g13n

Я использую пакет узла 'url' (npm install url)

Что это делает, когда вы звоните

url.parse(req.url, true, true)

это даст вам возможность получить все или часть URL. Более подробная информация здесь: https://github.com/defunctzombie/node-url

Я использовал его следующим образом, чтобы получить то, что следует после/in http://www.example.com/ , чтобы использовать в качестве переменной и открыть определенный профиль (вроде как facebook: - http://www.facebook.com/username )

    var url = require('url');
    var urlParts = url.parse(req.url, true, true);
    var pathname = urlParts.pathname;
    var username = pathname.slice(1);

Хотя, чтобы это работало, вы должны создать свой маршрут таким образом в вашем файле server.js:

self.routes['/:username'] = require('./routes/users');

И установите свой файл маршрута следующим образом:

router.get('/:username', function(req, res) {
 //here comes the url parsing code
}
4
Sacha Nacar

Я на самом деле обнаружил, что с помощью этого кода ниже вы можете получить свой URL. Затем приступить к нарезке и решить, что дальше.

app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
  });
1
Kennedy Nyaga

Спасибо всем за эту информацию. Это невероятно раздражает.

Добавьте это в свой код, и вам никогда не придется думать об этом снова:

var app = express();

app.all("*", function (req, res, next) {  // runs on ALL requests
    req.fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl
        next()
})

Вы также можете делать или устанавливать другие вещи, такие как вход в консоль.

0
Nico