Как получить полный 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, в этом случае вы знаете, что это ваш протоколхозяин приходит из
req.get('host')как указал ГопалНадеюсь, вам не нужен нестандартный порт в ваших URL, но если вам нужно было знать, что у вас будет это в вашем состоянии приложения, потому что это все, что вы передали
app.listenво время запуска сервера. Однако в случае локальной разработки на нестандартном порту Chrome, похоже, включает порт в заголовок хоста soreq.get('host')возвращаетlocalhost:3000, например. Поэтому, по крайней мере, для случаев производственного сайта на стандартном порту и просмотра непосредственно вашего экспресс-приложения (без обратного прокси),hostзаголовок, кажется, делает правильную вещь относительно порта в URL-адрес.путь идет от
req.originalUrl(спасибо @pgrassant). Обратите внимание, это не включает в себя строки запроса. документы здесь на req.адрес и треб.originalUrl. В зависимости от того, что вы собираетесь делать с URL,originalUrlможет быть или не быть правильным значением по сравнению сreq.url.объедините их все вместе, чтобы восстановить абсолютный URL.
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
вместо того, чтобы объединять вещи вместе самостоятельно, вы могли бы вместо этого использовать узел.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 }); }
Я нашел его немного Пита, чтобы получить запрошенный url. Я не могу поверить, что нет более простого способа в express. Должно быть просто 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.хост/Треб.имя хоста эффективное должно иметь два условия, когда Экспресс за прокси:
app.set('trust proxy', 'loopback');в приложение.jsX-Forwarded-Hostзаголовок должен быть указан вами в веб-сервере. например. apache, nginxnginx:
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>
вы должны построить его с помощью
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 file:
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); });
Comments