एक्सप्रेस में पूर्ण यूआरएल कैसे प्राप्त करें?


486

मान लीजिए कि मेरा नमूना url है

http://example.com/one/two

और मैं कहता हूं कि मेरे पास निम्नलिखित मार्ग हैं

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

का मान urlहोगा /one/two

एक्सप्रेस में मुझे पूरा यूआरएल कैसे मिलेगा ? उदाहरण के लिए, उपरोक्त मामले में, मैं प्राप्त करना चाहूंगा http://example.com/one/two


6
FYI करें आप अनुरोध वस्तु का निरीक्षण कर सकते हैं और देख सकते हैं लेकिन मैं एक पाखंडी हूँ और इसे यहाँ पाया।
जेसन सेब्रिंग

जवाबों:


742
  1. प्रोटोकॉल के रूप में उपलब्ध है req.protocolयहाँ डॉक्स

    1. एक्सप्रेस 3.0 से पहले, आप उस प्रोटोकॉल को मान सकते हैं httpजब तक कि आप यह नहीं देखते कि req.get('X-Forwarded-Protocol')सेट किया गया है और उसका मूल्य है https, जिस स्थिति में आप जानते हैं कि आपका प्रोटोकॉल है
  2. मेजबान से आता है जैसा req.get('host')कि गोपाल ने संकेत दिया है

  3. उम्मीद है कि आपको अपने URL में एक गैर-मानक पोर्ट की आवश्यकता नहीं है, लेकिन अगर आपको यह जानने की आवश्यकता है कि आपके पास यह आपके एप्लिकेशन स्थिति में होगा, क्योंकि यह वह है जो आपने app.listenसर्वर स्टार्टअप समय पर पारित किया है । हालांकि, गैर-मानक पोर्ट पर स्थानीय विकास के मामले में, Chrome होस्ट होस्ट हेडर में पोर्ट को शामिल करता है इसलिए req.get('host')रिटर्न करता है localhost:3000, उदाहरण के लिए। तो कम से कम एक मानक बंदरगाह पर एक उत्पादन साइट के मामलों के लिए और सीधे अपने एक्सप्रेस ऐप (रिवर्स प्रॉक्सी के बिना) पर ब्राउज़ करने के लिए, hostशीर्ष लेख URL में पोर्ट के संबंध में सही काम करता है।

  4. रास्ता से आता है req.originalUrl(धन्यवाद @pgrassant)। ध्यान दें कि इसमें क्वेरी स्ट्रिंग शामिल नहीं है। डॉक्स यहाँ req.url और req.originalUrl पर । इस बात पर निर्भर करता है कि आप URL के साथ क्या करना चाहते हैं, originalUrlइसकी तुलना में सही मूल्य हो भी सकता है और नहीं भी req.url

उन सभी को एक साथ मिलाकर पूर्ण URL का पुनर्निर्माण करें।

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

3
@ एक क्लाइंट जो चाहे हेडर भेज सकता है (साथ ही जो भी URL, पोर्ट, रैंडम गैर-HTTP कचरा है), कुछ बिंदु पर फर्जी या गलत हेडर लगा सकता है, जिससे प्रोटोकॉल फेल हो जाएगा। उदाहरण के लिए, एक वर्चुअल होस्ट वातावरण में, एक गलत "होस्ट" हेडर पूरी तरह से अलग वेब साइट प्रदर्शित करेगा। एक्स-फ़ॉर्वर्ड-प्रोटोकॉल के मामले में, जो आमतौर पर वास्तविक क्लाइंट (ब्राउज़र) द्वारा नहीं भेजा जाता है, लेकिन रिवर्स प्रॉक्सी (nginx / वार्निश / अपाचे / जो भी) जो आपके आवेदन के सामने HTTPS सेवारत है।
पीटर ल्योन

59
या req.get('Host')इसके बजाय का उपयोग करें req.hostजो मेजबान प्लस पोर्ट अनुभाग देता है।
डायोसनी

1
संभवतः इसके लिए एक अलग प्रश्न पोस्ट करना सबसे अच्छा है। यह सवाल एक्सप्रेस के बारे में है।
पीटर ल्योन

18
hostअनुरोध शीर्षों में पैरामीटर जाली जा सकता है। res.hostइस तरह से उपयोग करने पर संभावित "होस्ट हेडर अटैक" होता है । Django ढांचे में उनके पास एक 'अनुमत होस्ट' वैरिएबल है जो इस तरह के हमले को रोकने के लिए उपयोग किया जाता है। मैं एक कॉन्फ़िगरेशन चर का उपयोग करता हूं root_urlजो मेरा है जिसे req.urlपूरा करने के लिए जोड़ा जा सकता है । : हमले के बारे में skeletonscribe.net/2013/05/...
आमिर Eldor

1
यदि आप req.originalUrlमापदंडों के बिना जोड़ना चाहते हैं , तो बस करें req.originalUrl.split("?").shift()। स्रोत: stackoverflow.com/a/32118818/2037431
मार्कोस परेरा

131

अपने दम पर एक साथ चीजों को जोड़ने के बजाय, आप URL के लिए नोड.जेएस एपीआई का उपयोग कर सकते हैं और URL.format()एक्सप्रेस से एक्सप्रेस पास कर सकते हैं।

उदाहरण:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    host: req.get('host'),
    pathname: req.originalUrl
  });
}

4
मेरे मामले में req.get('host')केवल होस्टनाम भाग देता है, पोर्ट नहीं। पता नहीं क्यों, लेकिन अब मैं सेटिंग्स से पोर्ट नंबर इकट्ठा करता हूं, और hostnameइसके बजाय फ़ील्ड का उपयोग करता हूं host
मैक्सकोरुकोव

1
इसके बजाय pathname, मुझे लगता है कि आप का मतलब है path। जिसमें खोज / क्वेरिस्ट्रिंग शामिल है
फेलिक्स सन

3
यह URL के लिए काम नहीं करता है जिसमें क्वेरी स्ट्रिंग है।
कीथ

37

मुझे यह अनुरोधित यूआरएल प्राप्त करने के लिए एक PITA का थोड़ा सा मिला। मैं विश्वास नहीं कर सकता कि एक्सप्रेस में एक आसान तरीका नहीं है। बस 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
है req.portमौजूद हैं? यह एक्सप्रेस प्रलेखन में नहीं है?
मेटर

मेरी गलती। मैंने मान लिया कि आपको पता चल जाएगा कि आप किस पोर्ट को बंद कर रहे हैं और उस से पहले सेट कर रहे हैं। मैं फिर से उदाहरण को अपडेट करूंगा। आप इसे प्राप्त भी कर सकते हैंreq.app.settings.port
chovy

जब req.protocol खाली हो, तो क्या इसका मतलब http है?
कोडबट

यह क्वेरी शामिल नहीं है। यह पूर्ण नहीं है। स्वीकृत उत्तर बेहतर है।
कोस्तनोस

17

Url.format का उपयोग करना :

var url = require('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);

16

यहाँ एक फ़ंक्शन जोड़ने का एक शानदार तरीका है जिसे आप url प्राप्त करने के लिए req ऑब्जेक्ट पर कॉल कर सकते हैं

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

अब आपके पास एक फ़ंक्शन है जिसे आप ज़रूरत पड़ने पर मांग सकते हैं।


2
इसमें उस उपयोगकर्ता को शामिल नहीं किया गया है: पासवर्ड जिसे आप पूर्ण url ' उपयोगकर्ता: pass@host.com: 8080 / p / a / t / h? Query = string # hash ' में शामिल कर सकते हैं
कोड विशिष्ट

@CodeUniquely सच है, लेकिन उस सम्मेलन के बाद से अब एक दशक से अधिक के लिए पदावनत कर दिया गया है, उम्मीद है कि कोई भी वास्तव में उनके एपीआई में यूजरइनो स्पेक्स का निर्माण नहीं कर रहा है
माइक

11

जब प्रॉक्स के पीछे एक्सप्रेस हो तो req.host/req.hostname को प्रभावी बनाने के लिए दो शर्त होनी चाहिए :

  1. app.set('trust proxy', 'loopback'); app.js में
  2. X-Forwarded-Hostहैडर को आपके द्वारा वेबसर्वर में निर्दिष्ट किया जाना चाहिए। जैसे। अपाचे, नग्नेक्स

नग्नेक्स :

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>


1
हां, कोई भी नहीं है कि कहा, अगर तुम अपाचे या nginx में कोई सही विन्यास है, तो आप मिल जाएगा 127.0.0.1सेreq.get('host')
Spark.Bao


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

या

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

6

आपको इसका उपयोग करके निर्माण करने की आवश्यकता है req.headers.host + req.url। यदि आप एक अलग बंदरगाह में होस्ट कर रहे हैं और निश्चित रूप से आप इस विचार प्राप्त ;-)


1
कि मुझे सब कुछ मिलता है, लेकिन प्रोटोकॉल ... क्या ऐसा कुछ है जो मुझे बता सकता है?
क्रिस अब्राम्स

प्रोटोकॉल का उपयोग करने के लिए:req.protocol
क्रमित करें

6

मैं सुझाव दूंगा कि URL के बजाय मूल उपयोग करें:

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

यहाँ ओरिजिनल का विवरण देखें: http://expressjs.com/api.html#req.originalUrl

हमारे सिस्टम में, हम ऐसा कुछ करते हैं, इसलिए हमारे लिए ओरिजनल महत्वपूर्ण है:

  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 को बार कंट्रोलर के हैंडलर की जरूरत है।


6

मेरा कोड इस तरह दिखता है,

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


5

मैं नोड पैकेज 'url' (npm install url) का उपयोग करता हूं

जब आप कॉल करते हैं तो यह क्या करता है

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

यह आपको url के सभी या भागों को पुनः प्राप्त करने की संभावना देगा। अधिक जानकारी यहाँ: https://github.com/defunctzombie/node-url

मैंने इसे निम्नलिखित तरीके से उपयोग किया जो कि / के बाद http://www.example.com/ में एक चर के रूप में उपयोग करने और एक विशेष प्रोफ़ाइल (फेसबुक की तरह: http: //www.facebook) को खींचने के लिए आता है । कॉम / उपयोगकर्ता नाम )

    var url = require('url');
    var urlParts = url.parse(req.url, true, true);
    var pathname = urlParts.pathname;
    var username = pathname.slice(1);

हालांकि इसके लिए काम करने के लिए, आपको अपने मार्ग को अपने सर्वर में इस तरह से बनाना होगा। जेएस फाइल:

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

और अपनी रूट फाइल को इस तरह सेट करें:

router.get('/:username', function(req, res) {
 //here comes the url parsing code
}

2

आप इस फ़ंक्शन का उपयोग इस तरह से मार्ग में कर सकते हैं

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आपको http या https req.headers.hostदेगा , आपको पूरा होस्ट नाम देगा जैसे www.google.com, req.originalUrlबाकी राशि देगा pathName(आपके मामले में /one/two)


क्या आप इस बारे में विस्तार से बता सकते हैं कि यह समाधान कैसे काम करता है। केवल स्टैक ओवरफ्लो पर उत्तर पोस्ट करने से बचें।
तीरथ

@ अर्कथ विस्तृत।
प्रतीक्षित अय्यूब

1

इस जानकारी के लिए आप सभी का धन्यवाद। यह अविश्वसनीय रूप से कष्टप्रद है।

इसे अपने कोड में जोड़ें और आपको इसके बारे में फिर कभी नहीं सोचना होगा:

var app = express();

app.all("*", function (req, res, next) {  // runs on ALL requests
    req.fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl
        next()
})

आप वहां अन्य चीजें भी कर सकते हैं या सेट कर सकते हैं, जैसे कि लॉग इन कंसोल।


0

बस नीचे दिया गया कोड मेरे लिए काफी था!

const baseUrl = `${request.protocol}://${request.headers.host}`;
// http://127.0.0.1:3333
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.