2015-09-08 5 views
5

कई SO प्रश्न हैं कि जावास्क्रिप्ट के साथ http शीर्षलेख कैसे प्राप्त करें, लेकिन किसी कारण से वे HTTP_CF_IPCOUNTRY शीर्षलेख नहीं दिखाते हैं।जावास्क्रिप्ट के साथ क्लाउडफ्लारे का HTTP_CF_IPCOUNTRY शीर्षलेख प्राप्त करें?

यदि मैं php echo $_SERVER["HTTP_CF_IPCOUNTRY"]; के साथ करने का प्रयास करता हूं, तो यह काम करता है, इसलिए सीएफ ठीक काम कर रहा है।

क्या यह हेडर जावास्क्रिप्ट के साथ प्राप्त करना संभव है?

+0

कौन सा जावास्क्रिप्ट आपका मतलब है - क्लाइंट या सर्वर-साइड (नोड)? – hindmost

+0

क्लाइंट साइड जेएस। –

उत्तर

5

मान लीजिए कि आप क्लाइंट साइड जावास्क्रिप्ट के बारे में बात कर रहे हैं: नहीं, यह संभव नहीं है।

  1. ब्राउज़र सर्वर को HTTP अनुरोध करता है।
  2. सर्वर नोटिस क्या आईपी अनुरोध के संबंध
  3. से आया सर्वर एक डेटाबेस में है कि आईपी पते लग रहा है और पीएचपी
  4. को समानता रखने वाले देश
  5. सर्वर से गुजरता है कि देश पाता

डेटा कभी नहीं ब्राउज़र के पास भी जाता है।

जावास्क्रिप्ट को एक्सेस करने के लिए, आपको इसे सर्वर साइड कोड के साथ पढ़ना होगा और फिर ब्राउज़र पर प्रतिक्रिया में डाल देना होगा।

2

@ क्वांटिन का जवाब सही है और किसी भी जावास्क्रिप्ट क्लाइंट के लिए सर्वर शीर्षलेख तक पहुंचने का प्रयास करने के लिए सही है।

हालांकि, चूंकि यह प्रश्न क्लाउडलाफेयर के लिए विशिष्ट है और 2 अक्षर देश आईएसओ सामान्य रूप से HTTP_CF_IPCOUNTRY शीर्षलेख में प्राप्त करने के लिए विशिष्ट है, मेरा मानना ​​है कि मेरे पास एक कार्य-आसपास है जो प्रश्न पूछे जाने वाले सर्वोत्तम कार्यों के बारे में है।

नीचे एक कोड अंश है कि मैं अपने दृश्यपटल App एंबर पर उपयोग करते हैं, CloudFlare पीछे बैठे ... और वार्निश ... और फ़ास्टबूट ...

function parseTrace(url){ 
    let trace = []; 
    $.ajax(url, 
     { 
      success: function(response){ 
       let lines = response.split('\n'); 
       let keyValue; 

       lines.forEach(function(line){ 
        keyValue = line.split('='); 
        trace[keyValue[0]] = decodeURIComponent(keyValue[1] || ''); 

        if(keyValue[0] === 'loc' && trace['loc'] !== 'XX'){ 
         alert(trace['loc']); 
        } 

        if(keyValue[0] === 'ip'){ 
         alert(trace['ip']); 
        } 

       }); 

       return trace; 
      }, 
      error: function(){ 
       return trace; 
      } 
     } 
    ); 
}; 

let cfTrace = parseTrace('/cdn-cgi/trace'); 

प्रदर्शन, वास्तव में वास्तव में महान है डॉन 'है अन्य एपीआई या कार्यों को कॉल करने से पहले भी इस फ़ंक्शन को कॉल करने से डरें। मैंने इसे क्लाउडफ्लेयर के कैश से स्थिर संसाधनों को पुनर्प्राप्त करने के लिए जितनी जल्दी या कभी भी तेज पाया है। आप इसकी पुष्टि करने के लिए पिंगडम पर एक प्रोफाइल चला सकते हैं।

संबंधित मुद्दे