Как получить полный 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.

13 ответов


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

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

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

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

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

  var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;

вместо того, чтобы объединять вещи вместе самостоятельно, вы могли бы вместо этого использовать узел.JS API для URLs и передать URL.format() информация от express.

пример:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    host: req.get('host'),
    pathname: req.originalUrl
  });
}

Я нашел его немного Пита, чтобы получить запрошенный 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;

используя URL-адрес.формат:

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);

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

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

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


сделать req.хост/Треб.имя хоста effective должно иметь два условия, когда Экспресс за прокси:

  1. app.set('trust proxy', 'loopback'); в приложение.js

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

var url = req.headers.host + '/' + req.url;

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


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

params['host_url'] = req.protocol + '://' + req.headers.host + req.url;


Я бы предложил использовать 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 в контроллере бара получить обработчик.


var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;

или

var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;`

Я использую пакет узлов '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);

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

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

и установите файл маршрута таким образом:

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

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

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