Как получить полный url в Express?
допустим, мой пример url
и я говорю, что по маршруту
app.get('/one/two', function (req, res) {
var url = req.url;
}
значение url
будет /one/two
.
как сделать полный url в Express?
Например, в приведенном выше случае, я хотел бы получить http://example.com/one/two
.
13 ответов
-
протокол доступен как
req.protocol
. документы здесь- перед express 3.0 протокол, который вы можете считать
http
Если вы не видите, чтоreq.get('X-Forwarded-Protocol')
установлен и имеет значениеhttps
, в этом случае вы знаете, что это ваш протокол
- перед express 3.0 протокол, который вы можете считать
хозяин приходит из
req.get('host')
как указал ГопалНадеюсь, вам не нужен нестандартный порт в ваших URL-адресах, но если вам нужно было знать, что вы будете иметь его в своем состоянии приложения, потому что это то, что вы передали
app.listen
во время запуска сервера. Однако в случае локальной разработки на нестандартном порту Chrome, похоже, включает порт в заголовок хоста soreq.get('host')
возвращаетlocalhost:3000
, например. Поэтому, по крайней мере, для случаев производственного сайта на стандартном порту и просмотра непосредственно в вашем приложении express (без обратного прокси-сервера),host
заголовок, похоже, делает правильную вещь относительно порта в URL-адрес.путь идет от
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 должно иметь два условия, когда Экспресс за прокси:
-
app.set('trust proxy', 'loopback');
в приложение.js
вам нужно построить его с помощью 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);
});