Jak uzyskać pełny adres URL w Express?

Powiedzmy, że mój przykładowy adres url to

Http://example.com/one/two

And I say I have the following route

app.get('/one/two', function (req, res) {
    var url = req.url;
}

Wartość url będzie /one/two.

Jak uzyskać pełny url w Expressie? Na przykład w powyższym przypadku chciałbym otrzymać http://example.com/one/two.

Author: nbro, 2012-04-17

13 answers

  1. Protokół jest dostępny jako req.protocol. docs here

    1. przed Expressem 3.0 PROTOKÓŁ można założyć jako http, chyba że widzisz, że req.get('X-Forwarded-Protocol') jest ustawiony i ma wartość https, w którym to przypadku wiesz, że jest to Twój protokół
  2. Nosiciel pochodzi z req.get('host') jak wskazał Gopal

  3. Mam nadzieję, że nie potrzebujesz niestandardowego portu w swoich adresach URL, ale gdybyś musiał go znać, miałbyś go w stanie aplikacji ponieważ to jest to, co przekazałeś app.listen w czasie uruchamiania serwera. Jednak w przypadku lokalnego rozwoju na niestandardowym porcie, Chrome wydaje się zawierać port w nagłówku hosta, więc req.get('host') zwraca localhost:3000, na przykład. Tak więc przynajmniej w przypadku witryny produkcyjnej na standardowym porcie i przeglądania bezpośrednio do aplikacji express (bez odwrotnego proxy), nagłówek host wydaje się działać poprawnie w odniesieniu do portu w adresie URL.

  4. Ścieżka pochodzi z req.originalUrl (dzięki @pgrassant). Uwaga dotyczy to łańcucha zapytania. dokumenty tutaj na req.url i req.originalUrl . W zależności od tego, co zamierzasz zrobić z adresem URL, originalUrl może być poprawną wartością w porównaniu do req.url.

Połącz te wszystkie razem, aby odtworzyć absolutny adres URL.

  var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
 549
Author: Peter Lyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-28 21:29:42

Zamiast łączenia rzeczy na własną rękę, możesz zamiast tego użyć węzła.js API dla adresów URL i przekazać URL.format() informacje z express.

Przykład:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    host: req.get('host'),
    pathname: req.originalUrl
  });
}
 100
Author: Michael Weibel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-28 14:24:53

Znalazłem trochę PITA, aby uzyskać żądany adres url. Nie mogę uwierzyć, że nie ma łatwiejszego sposobu na ekspres. Powinien być tylko req.requested_url

Ale tak to ustawiłem:

var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.host  + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
 30
Author: chovy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 22:08:48

Using url.format :

var url = require('url');

Obsługuje wszystkie protokoły i zawiera numer portu. Jeśli nie masz łańcucha zapytania w swoim originalUrl możesz użyć tego rozwiązania cleaner:

var requrl = url.format({
    protocol: req.protocol,
    host: req.get('host'),
    pathname: req.originalUrl,
});

Jeśli masz ciąg zapytania:

var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.host = req.get('host');
var requrl = url.format(urlobj);
 17
Author: mpolci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-02 07:39:46

Oto świetny sposób na dodanie funkcji, którą możesz wywołać w obiekcie req, aby uzyskać adres url

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

Teraz masz funkcję, którą możesz wywołać na żądanie, jeśli jej potrzebujesz.

 13
Author: lostintranslation,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 23:07:32

Make req.host / req.Nazwa hosta skuteczna musi mieć dwa warunki, gdy wyrażają się za proxy :

  1. app.set('trust proxy', 'loopback'); w aplikacji.js
  2. X-Forwarded-Host nagłówek musi być określony przez Ciebie w serwerze. np. 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;
    }
}

Apache :

<VirtualHost myhost:80>
    ServerName myhost
    DocumentRoot /path/to/myapp/public
    ProxyPass / http://myapp:8080/
    ProxyPassReverse / http://myapp:8080/
</VirtualHost>
 9
Author: zhi.yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 01:58:16

Użyj tego,

var url = req.headers.host + '/' + req.url;
 8
Author: Vaghani Janak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 04:44:08

Musisz go skonstruować za pomocą req.headers.host + req.url. Oczywiście jeśli hostujesz w innym porcie i taki masz pomysł; -)

 6
Author: g13n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-17 00:08:00

Mój kod wygląda tak,

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

 6
Author: soomtong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-23 09:47:36

Sugerowałbym użycie originalUrl zamiast URL:

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

Zobacz opis oryginału tutaj: http://expressjs.com/api.html#req.originalUrl

W naszym systemie robimy coś takiego, więc originalUrl jest dla nas ważny:

  foo = express();
  express().use('/foo', foo);
  foo.use(require('/foo/blah_controller'));

Blah_controller wygląda tak:

  controller = express();
  module.exports = controller;
  controller.get('/bar/:barparam', function(req, res) { /* handler code */ });

Więc nasze adresy URL mają format:

www.example.com/foo/bar/:barparam

Dlatego potrzebujemy req.originalUrl w kontrolerze paska get handler.

 5
Author: Amber Haq Dixon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 19:30:41
var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;

Lub

var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;`
 5
Author: mlibre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 10:08:16

Używam pakietu node ' url ' (npm install url)

To, co robi, gdy dzwonisz

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

Daje możliwość pobrania całości lub części adresu url. Więcej informacji tutaj: https://github.com/defunctzombie/node-url

Użyłem go w następujący sposób, aby uzyskać to, co przychodzi po / in http://www.example.com / aby użyć jako zmiennej i podciągnąć konkretny profil (coś jak 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);

Aby to zadziałało, musisz stworzyć swoją trasę w ten sposób na serwerze.plik js:

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

I ustaw plik trasy w ten sposób:

router.get('/:username', function(req, res) {
 //here comes the url parsing code
}
 4
Author: Sacha Nacar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-12 13:56:36

Odkryłem, że używając poniższego kodu możesz uzyskać swój adres url. Następnie przejdź do krojenia go i decydując, co dalej.

app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
  });
 2
Author: Kennedy Nyaga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 09:56:42