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