Powiedzmy, że mój przykładowy adres URL to
i mówię, że mam następującą trasę
app.get('/one/two', function (req, res) {
var url = req.url;
}
Wartość url
będzie /one/two
.
Jak uzyskać pełny adres URL w Express? Na przykład w powyższym przypadku chciałbym otrzymać http://example.com/one/two
.
Odpowiedzi:
Protokół jest dostępny jako
req.protocol
. dokumenty tutajhttp
chyba że zobaczysz, żereq.get('X-Forwarded-Protocol')
jest ustawiony i ma wartośćhttps
, w którym to przypadku wiesz, że to twój protokółHost pochodzi z,
req.get('host')
jak wskazał GopalMamy nadzieję, że nie potrzebujesz niestandardowego portu w swoich adresach URL, ale gdybyś musiał to wiedzieć, miałby to stan aplikacji, ponieważ jest to wszystko, co przekazałeś
app.listen
w momencie uruchamiania serwera. Jednak w przypadku programowania lokalnego na niestandardowym porcie Chrome wydaje się zawierać port w nagłówku hosta, więc na przykładreq.get('host')
zwracalocalhost:3000
. Tak więc przynajmniej w przypadku witryny produkcyjnej na standardowym porcie i przeglądania bezpośrednio do Twojej aplikacji ekspresowej (bez odwrotnego proxy),host
nagłówek wydaje się robić właściwą rzecz w odniesieniu do portu w adresie URL.Ścieżka pochodzi z
req.originalUrl
(dzięki @pgrassant). Zauważ, że NIE zawiera ciągu 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ć lub nie być poprawną wartością w porównaniu doreq.url
.Połącz je wszystkie, aby zrekonstruować bezwzględny adres URL.
źródło
req.get('Host')
zamiast tegoreq.host
daje hosta i sekcję portu.host
Parametr w nagłówku żądania mogą być sfałszowane. Istnieje możliwość „ataku nagłówkiem hosta”, jeśli używasz wres.host
ten sposób. W środowisku Django mają zmienną „dozwolone hosty”, która służy do zapobiegania takiemu atakowi. Używam zmiennej konfiguracyjnej, która jest moja,root_url
którą można dodać doreq.url
uzupełnienia. O ataku: skeletonscribe.net/2013/05/…req.originalUrl
bez parametrów, po prostu zróbreq.originalUrl.split("?").shift()
. Źródło: stackoverflow.com/a/32118818/2037431Zamiast łączyć rzeczy razem, możesz zamiast tego użyć API node.js dla adresów URL i przekazać
URL.format()
informacje z ekspresu.Przykład:
źródło
req.get('host')
zwraca tylko część nazwy hosta , a nie port. Nie wiem dlaczego, ale teraz zbieram numer portu z ustawień i używamhostname
pola zamiasthost
.pathname
myślę, że masz na myślipath
. Który obejmuje wyszukiwanie / kwerendęZnalazłem trochę PITA, aby uzyskać żądany adres URL. Nie mogę uwierzyć, że nie ma łatwiejszego sposobu na ekspresowe. Powinien być tylko wymagany.wymagany_url
Ale oto jak to ustawiłem:
źródło
req.port
istnieje Nie ma go w dokumentacji Express?req.app.settings.port
Za pomocą url.format :
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:
Jeśli masz ciąg zapytania:
źródło
Oto świetny sposób na dodanie funkcji, którą można wywołać na obiekcie req w celu uzyskania adresu URL
Teraz masz funkcję, którą możesz wywołać na żądanie, jeśli jej potrzebujesz.
źródło
aby req.host/req.hostname działał, muszą mieć dwa warunki, gdy Express za serwerami proxy :
app.set('trust proxy', 'loopback');
w app.jsX-Forwarded-Host
nagłówek musi być określony przez Ciebie na serwerze internetowym. na przykład. apache, nginxnginx :
apache :
źródło
127.0.0.1
odreq.get('host')
Użyj tego,
źródło
lub
źródło
Musisz go zbudować za pomocą
req.headers.host + req.url
. Oczywiście, jeśli hostujesz w innym porcie i taki masz pomysł ;-)źródło
req.protocol
Sugerowałbym użycie originalUrl zamiast adresu URL:
Zobacz opis originalUrl tutaj: http://expressjs.com/api.html#req.originalUrl
W naszym systemie robimy coś takiego, więc originalUrl jest dla nas ważny:
blah_controller wygląda następująco:
Nasze adresy URL mają więc format:
Dlatego potrzebujemy req.originalUrl w kontrolerze pasków get handler.
źródło
Mój kod wygląda tak
params['host_url'] = req.protocol + '://' + req.headers.host + req.url;
źródło
Korzystam z pakietu węzła „url” (npm url install)
To, co robi, to kiedy dzwonisz
da ci to możliwość odzyskania 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ć wszystko, co następuje po / w http://www.example.com/, aby użyć go jako zmiennej i wyświetlić konkretny profil (coś w rodzaju facebooka: http: //www.facebook. com / nazwa użytkownika )
Aby to zadziałało, musisz utworzyć swoją trasę w ten sposób w pliku server.js:
I ustaw plik trasy w ten sposób:
źródło
Możesz użyć tej funkcji na takiej trasie
req.protocol
poda adres http lub https,req.headers.host
poda pełną nazwę hosta, taką jak www.google.com,req.originalUrl
poda resztępathName
(w twoim przypadku/one/two
)źródło
Dziękuję wszystkim za tę informację. To jest niezwykle denerwujące.
Dodaj to do swojego kodu i już nigdy nie będziesz musiał o tym myśleć:
Możesz tam też wykonywać inne czynności, np. Logować do konsoli.
źródło
Tylko poniższy kod był dla mnie wystarczający!
źródło