Katakanlah url sampel saya adalah
dan saya katakan saya memiliki rute berikut
app.get('/one/two', function (req, res) {
var url = req.url;
}
Nilai url
akan /one/two
.
Bagaimana cara mendapatkan url lengkap di Express? Misalnya, dalam kasus di atas, saya ingin menerima http://example.com/one/two
.
Jawaban:
Protokol tersedia sebagai
req.protocol
. dokumen di sinihttp
kecuali Anda melihat bahwa itureq.get('X-Forwarded-Protocol')
telah diatur dan memiliki nilaihttps
, dalam hal ini Anda tahu itu adalah protokol AndaTuan rumah datang dari
req.get('host')
seperti yang ditunjukkan GopalMudah-mudahan Anda tidak memerlukan port non-standar di URL Anda, tetapi jika Anda memang perlu mengetahuinya, Anda akan memilikinya dalam status aplikasi Anda karena itu adalah apa pun yang Anda lewati
app.listen
saat startup server. Namun, dalam kasus pengembangan lokal pada port non-standar, Chrome tampaknya memasukkan port dalam header host sehinggareq.get('host')
kembalilocalhost:3000
, misalnya. Jadi setidaknya untuk kasus-kasus sebuah situs produksi pada port standar dan menjelajah langsung ke aplikasi ekspres Anda (tanpa proxy terbalik),host
header tampaknya melakukan hal yang benar terkait port di URL.Path berasal dari
req.originalUrl
(thanks @pgrassant). Catatan ini TIDAK termasuk string kueri. docs di sini di req.url dan req.originalUrl . Bergantung pada apa yang ingin Anda lakukan dengan URL,originalUrl
mungkin atau mungkin bukan nilai yang benar dibandingkan denganreq.url
.Gabungkan semuanya untuk merekonstruksi URL absolut.
sumber
req.get('Host')
alih-alihreq.host
yang memberikan host plus bagian port.host
parameter dalam header permintaan dapat palsu. Ada kemungkinan "serangan header host" jika menggunakanres.host
cara ini. Dalam kerangka Django mereka memiliki variabel 'host diizinkan' yang digunakan untuk mencegah serangan tersebut. Saya menggunakan variabel konfigurasi yang sayaroot_url
dapat ditambahkan kereq.url
untuk penyelesaian. Tentang serangan: skeletonscribe.net/2013/05/...req.originalUrl
tanpa parameter, cukup lakukanreq.originalUrl.split("?").shift()
. Sumber: stackoverflow.com/a/32118818/2037431Alih-alih menyatukan semuanya sendiri, Anda bisa menggunakan API node.js untuk URL dan meneruskan
URL.format()
informasi dari express.Contoh:
sumber
req.get('host')
hanya mengembalikan bagian hostname , bukan port. Tidak tahu mengapa, tapi sekarang saya mengumpulkan nomor port dari pengaturan, dan menggunakanhostname
bidang, bukanhost
.pathname
, saya pikir maksud Andapath
. Yang termasuk search / querystringSaya menemukan sedikit PITA untuk mendapatkan url yang diminta. Saya tidak percaya tidak ada cara yang lebih mudah dalam mengekspresikan. Seharusnya req.requested_url
Tapi begini cara saya mengaturnya:
sumber
req.port
ada Tidak ada dalam dokumentasi Express?req.app.settings.port
Menggunakan url.format :
Ini mendukung semua protokol dan termasuk nomor port. Jika Anda tidak memiliki string kueri di originalUrl Anda, Anda dapat menggunakan solusi bersih ini:
Jika Anda memiliki string kueri:
sumber
Berikut adalah cara yang bagus untuk menambahkan fungsi yang dapat Anda panggil pada objek req untuk mendapatkan url
Sekarang Anda memiliki fungsi yang dapat Anda panggil berdasarkan permintaan jika Anda membutuhkannya.
sumber
membuat req.host/req.hostname efektif harus memiliki dua kondisi ketika Express di belakang proxy :
app.set('trust proxy', 'loopback');
di app.jsX-Forwarded-Host
header harus ditentukan oleh Anda sendiri di server web. misalnya. apache, nginxnginx :
apache :
sumber
127.0.0.1
darireq.get('host')
Gunakan ini,
sumber
atau
sumber
Anda perlu membuatnya menggunakan
req.headers.host + req.url
. Tentu saja jika Anda hosting di port yang berbeda dan Anda mendapatkan ide tersebut ;-)sumber
req.protocol
Saya sarankan menggunakan originalUrl alih-alih URL:
Lihat deskripsi originalUrl di sini: http://expressjs.com/api.html#req.originalUrl
Dalam sistem kami, kami melakukan sesuatu seperti ini, jadi originalUrl penting bagi kami:
blah_controller terlihat seperti ini:
Jadi URL kami memiliki format:
Oleh karena itu, kita perlu req.originalUrl di bar controller get handler.
sumber
Kode saya terlihat seperti ini,
params['host_url'] = req.protocol + '://' + req.headers.host + req.url;
sumber
Saya menggunakan paket simpul 'url' (npm install url)
Apa yang dilakukannya adalah ketika Anda menelepon
itu akan memberi Anda kemungkinan untuk mengambil semua atau sebagian dari url. Info lebih lanjut di sini: https://github.com/defunctzombie/node-url
Saya menggunakannya dengan cara berikut untuk mendapatkan apa pun yang muncul setelah / di http://www.example.com/ untuk digunakan sebagai variabel dan menarik profil tertentu (seperti facebook: http: //www.facebook. com / nama pengguna )
Meskipun ini berfungsi, Anda harus membuat rute Anda dengan cara ini di file server.js Anda:
Dan atur file rute Anda dengan cara ini:
sumber
Anda dapat menggunakan fungsi ini di rute seperti ini
req.protocol
akan memberi Anda http atau https,req.headers.host
akan memberi Anda nama host lengkap seperti www.google.com,req.originalUrl
akan memberikan sisanyapathName
(dalam kasus Anda/one/two
)sumber
Terima kasih atas informasi ini. Ini sangat menjengkelkan.
Tambahkan ini ke kode Anda dan Anda tidak perlu memikirkannya lagi:
Anda dapat melakukan atau mengatur hal-hal lain di sana juga, seperti masuk ke konsol.
sumber
Hanya kode di bawah ini sudah cukup bagiku!
sumber