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

Ответ 1

  • Протокол доступен как req.protocol. docs here

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

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

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

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

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

Ответ 2

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

Пример:

var url = require('url');

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

Ответ 3

Я нашел немного 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;

Ответ 4

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

var url = require('url');

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

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

Ответ 5

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

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

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

Ответ 6

make req.host/req.hostname эффективный должен иметь два условия, когда Express за прокси-серверами:

  • app.set('trust proxy', 'loopback'); в app.js
  • 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;
    }
}

апач

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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

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

  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 bar.

Ответ 11

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

или же

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

Ответ 12

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

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

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

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

Я использовал его следующим образом, чтобы получить все, что приходит после /a 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
}

Ответ 13

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

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