2015-08-05 3 views
13

में एक अनुरोध के लिए पूरा यूआरएल कैसे प्राप्त करें मेरे हैपिज ऐप में, Request object दिए गए, मैं मूल, अनपेक्षित, असम्बद्ध यूआरएल कैसे पा सकता हूं?हैपी

function getRequestUrl (request) { 
    return ...; // What goes here? 
} 

मैंने पाया कि मैं Request.info.host, Request.path, और Request.query से कुछ हद तक एक साथ यह टुकड़ा कर सकते हैं, लेकिन यह योजना (यानी, http बनाम https) का अभाव है, और है एक kludge का एक सा। सादा यूआरएल कहीं उपलब्ध नहीं है?

उत्तर

28

पूरा यूआरएल कहीं भी संग्रहीत नहीं है जिसे आप प्राप्त कर सकते हैं। आपको इसे भागों से खुद को बनाने की जरूरत है:

const url = request.connection.info.protocol + '://' + request.info.host + request.url.path;

भले ही यह कट्टरपंथी प्रतीत हो सकता है, लेकिन अगर आप इसके बारे में सोचते हैं तो यह समझ में आता है क्योंकि कोई मूल, अनपेक्षित, असम्बद्ध URL नहीं है। HTTP अनुरोध है कि तार के ऊपर जाता है URL नहीं है के रूप में उदाहरण के लिए ब्राउज़र पता पट्टी में टाइप:

GET /hello?a=1&b=2 HTTP/1.1  // request.url.path 
Host: localhost:4000    // request.info.host 
Connection: keep-alive 
Accept-Encoding: gzip, deflate, sdch 
... 

और आप केवल पता चलेगा कि HAPI सर्वर कनेक्शन टीएलएस मोड में है या नहीं के आधार पर प्रोटोकॉल (request.connection.info.protocol)। यदि आप इसे

हालात

के बारे में पता होना करने के लिए या तो:

request.connection.info.uri या request.server.info.uri

सूचना दी होस्ट नाम वास्तविक मशीन के होस्ट नाम है कि सर्वर पर चल रहा है हो जाएगा (* निक्स पर hostname का आउटपुट)। आप वास्तविक होस्ट चाहते हैं व्यक्ति ब्राउज़र में लिखा जाता है (भिन्न हो सकता है) आप request.info.host जाँच करने के लिए जो HTTP अनुरोध के होस्ट हैडर से पार्स किया गया है की जरूरत है)

प्रॉक्सी पर जाएं और X-Forwarded-आद्य हैडर

यदि आपका अनुरोध प्रॉक्सी (ies)/लोड बैलेंसर्स/एचटीटीपीएस टर्मिनेटर के माध्यम से पारित हो गया है, तो संभव है कि कहीं भी एचटीटीपीएस यातायात समाप्त हो गया हो और HTTP सर्वर पर आपके सर्वर पर भेजा गया हो, इस मामले में आप मूल्य का उपयोग करना चाहेंगे x-forwarded-proto शीर्षलेख यदि यह वहां है:

const url = (request.headers['x-forwarded-proto'] || request.connection.info.protocol) + '://' + request.info.host + request.url.path;

टेम्पलेट तार के साथ:

const url = `${request.headers['x-forwarded-proto'] || request.connection.info.protocol}://${request.info.host}${request.url.path}`; 
+1

मूल URL और कच्चे HTTP अनुरोध के बारे में अच्छी बात। – gilly3

+0

'request.connection.info.protocol' इतना अच्छा समाधान नहीं है। यदि आपको प्रोटोकॉल को बेहतर तरीके से 'request.headers [' x-forwarded-proto '] ' – Petroff

+0

@Petroff धन्यवाद का उपयोग करने की आवश्यकता है, तो प्रॉक्सी के बारे में एक नोट के साथ मेरा उत्तर अपडेट किया गया। –

0

मैं अब निम्न सिंटैक्स का उपयोग (कॉफी स्क्रिप्ट का उपयोग कर):

server.on 'response', (data) -> 
    raw = data.raw.req 
    url = "#{data.connection.info.protocol}://#{raw.headers.host}#{raw.url}" 
    console.log "Access to #{url}" 

या जावास्क्रिप्ट के रूप में:

​server.on('response', function(data) { 
    var raw = data.raw.req; 
    var url = data.connection.info.protocol + "://" + 
    raw.headers.host + raw.url; 
    console.log("Access to " + url); 
}); 

है कि आप उपयोगकर्ता की तरह सटीक URL देता है यह अनुरोध किया।

0

आप URL नहीं मिल सकता है। आपको इसे उत्पन्न करना होगा। मैं इसका उपयोग कर रहा हूं:

const url = request.headers['x-forwarded-proto'] + '://' + 
      request.headers.host + 
      request.url.path; 
संबंधित मुद्दे