Porównaj ceny domen i usług IT, sprzedawców z całego świata

Jak uzyskać pełny adres URL w Express?


Powiedzmy, że mój przykładowy adres URL wygląda tak

http://example.com/one/two
http://example.com/one/twoi mówię, że mam następującą trasę
app.get('/one/two', function (req, res) {
var url = req.url;
}

Wartość
url
będzie miała wartość
/ one/two
.
Jak mogę uzyskać

pełny adres URL

w Express?
Na przykład w powyższym przypadku chciałbym uzyskać
[url=http://example.com/one/two]http://example.com/one/two[/url]
.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

  • Protokół jest dostępny jako
    req.protocol
    . dokumenty tutaj http://expressjs.com/api.html#req.protocol[list][*]Przed wersją Express 3.0 protokół można było uznać za
    http
    , chyba że widzisz, że
    req.get ('X-Forwarded-Protocol')
    jest zainstalowany i ustawiony na
    https
    , w takim przypadku wiesz, że to Twój protokół

[/*]
[*]
Host pochodzi z
req.get ('host')
, jak wskazał Gopal
[/*]
[*]
Mamy nadzieję, że nie potrzebujesz niestandardowego portu w swoich adresach URL, ale gdybyś musiał go znać, miałbyś go w stanie swojej aplikacji, ponieważ to właśnie przekazałeś do
app.listen
podczas uruchamiania serwera. Jednak w przypadku lokalnego programowania na niestandardowym porcie Chrome wydaje się umieszczać port w nagłówku hosta, więc
req.get ('host')
zwraca na przykład
localhost: 3000
. Tak więc przynajmniej w przypadku witryny produkcyjnej na standardowym porcie i bezpośredniego przeglądania aplikacji ekspresowej (bez odwrotnego serwera proxy) nagłówek
host
wydaje się działać prawidłowo w odniesieniu do portu w adresie URL.
[/*]
[*]
Ścieżka pochodzi z
req.originalUrl
(dzięki @pgrassant). Zwróć uwagę, że to TAKIE zawiera ciąg zapytania.

Dokumenty można znaleźć tutaj na req.url i req.originalUrl
http://expressjs.com/api.html#req.originalUrl... W zależności od tego, co zamierzasz zrobić z adresem URL,
originalUrl
może, ale nie musi, być poprawną wartością w porównaniu z
req.url
.
[/*]
[/list]
Połącz to wszystko, aby odtworzyć bezwzględny adres URL.
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zamiast samodzielnie łączyć rzeczy w pakiety, możesz użyć

node.js API dla adresów URL
http://nodejs.org/api/url.html
i przekaż
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
});
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Znalazłem to trochę jak PITA, aby uzyskać żądany adres URL. Nie mogę uwierzyć, że nie ma łatwiejszej drogi ekspresowej. Powinien to być po prostu req.requested_url
Ale oto jak to skonfigurowałem:
var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.host + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

Masz teraz funkcję, którą możesz wywołać na żądanie, jeśli jej potrzebujesz.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Za pomocą

url.format
https://nodejs.org/api/url.htm ... rlobj
:
var url = require('url');

Obsługuje wszystkie protokoły i zawiera numer portu. Jeśli nie masz ciągu zapytania w originalUrl, możesz użyć tego czystszego rozwiązania:
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);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

aby req.host/req.hostname było skuteczne, musi mieć dwa warunki kiedy

express dla pełnomocnika
http://expressjs.com/en/guide/behind-proxies.html
:
  • app.set („trust proxy”, „loopback”);
    w app.js
  • Nagłówek
    X-Forwarded-Host
    musisz samodzielnie określić na serwerze internetowym. na przykład. 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 [url=http://myapp:8080;]http://myapp:8080;[/url]
}
}


apache

:
<VirtualHost myhost:80>
ServerName myhost
DocumentRoot/path/to/myapp/public
ProxyPass/[url=http://myapp:8080/]http://myapp:8080/[/url]
ProxyPassReverse/[url=http://myapp:8080/]http://myapp:8080/[/url]
</VirtualHost>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj tego,
var url = req.headers.host + '/' + req.url;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

lub
var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Sugerowałbym użycie originalUrl zamiast adresu URL:
var url = req.protocol + '://' + req.get('host') + req.originalUrl;

Zobacz opis originalUrl tutaj:

http://expressjs.com/api.html#req.originalUrl
http://expressjs.com/api.html#req.originalUrl
W naszym systemie robimy coś podobnego, dlatego oryginalny Url jest dla nas ważny:
foo = express();
express().use('/foo', foo);
foo.use(require('/foo/blah_controller'));

blah_controller wygląda następująco:
controller = express();
module.exports = controller;
controller.get('/bar/:barparam', function(req, res) {/* handler code */ });

Dlatego nasze adresy URL mają następujący format:
www.example.com/foo/bar/:barparam

Dlatego potrzebujemy req.originalUrl w kontrolerze paska, aby uzyskać obsługę.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Musisz go zbudować za pomocą
req.headers.host + req.url
. Oczywiście, jeśli hostujesz na innym porcie i tak dalej, wpadniesz na ten pomysł ;-)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Mój kod wygląda tak,
params['host_url'] = req.protocol + '://' + req.headers.host + req.url;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Używam pakietu „url” węzła (adres URL instalacji npm)
Co on robi, kiedy dzwonisz
url.parse(req.url, true, true)

da ci to możliwość pobrania całości lub części adresu URL. Więcej informacji tutaj:

https://github.com/defunctzombie/node-url
https://github.com/defunctzombie/node-url
Użyłem go w następujący sposób, aby uzyskać wszystko, co pojawia się po/w

http:// www.example.com/
http://www.example.com/
użyć jako zmiennej i wyświetlić określony profil (coś w rodzaju Facebooka:

http://www.facebook.com/username
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);

Chociaż aby to zadziałało, musisz utworzyć swoją trasę w następujący sposób w pliku server.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
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć tej funkcji na swojej trasie w ten sposób
app.get('/one/two', function (req, res) {
const url = getFullUrl(req);
}/**
* Gets the self full URL from the request
*
* @param {object} req Request
* @returns {string} URL
*/
const getFullUrl = (req) => `${req.protocol}://${req.headers.host}${req.originalUrl}`;

req.protocol
da ci http lub https, a
req.headers.host
da ci w pełni kwalifikowaną nazwę hosta, taką jak www.google.com,
req .originalUrl
zwróci resztę
pathName
(w twoim przypadku
/ one/two
)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wystarczył mi poniższy kod!
<pre class="lang-js prettyprint-override">
const baseUrl = `${request.protocol}://${request.headers.host}`;
// [url=http://127.0.0.1:3333]http://127.0.0.1:3333[/url]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dziękuję wszystkim za te informacje. To jest niesamowicie irytujące.
Dodaj to do swojego kodu i już nigdy nie będziesz musiał o tym myśleć:
var app = express();app.all("*", function (req, res, next) {// runs on ALL requests
req.fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl
next()
})

Możesz tam robić lub instalować inne rzeczy, takie jak logowanie do konsoli.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się