इन दिनों लगभग सभी वेब डेवलपमेंट फ्रेमवर्क के साथ किए जाते हैं। चाहे आप रेल, सिनात्रा, या लोटस का उपयोग करें, आपको वास्तव में यह सोचने की ज़रूरत नहीं है कि कुकीज और अन्य शीर्षलेख nginx या apache से, एप्लिकेशन सर्वर और आपके ऐप में कैसे जाते हैं। वे बस करते हैं।
हम इस यात्रा की थोड़ी और गहराई से जाँच करने जा रहे हैं। क्योंकि यह पता चला है कि हेडर की कहानी में वेब के इतिहास के बारे में बहुत सारी रोचक जानकारी होती है।
वैसे भी HTTP शीर्षलेख क्या हैं?
जब भी कोई वेब ब्राउज़र अनुरोध करता है, तो वह इन चीज़ों को भेजता है जिन्हें HTTP हेडर कहा जाता है। उनमें कुकीज़, उपयोगकर्ता एजेंट के बारे में जानकारी, कैशिंग जानकारी - वास्तव में बहुत उपयोगी सामग्री शामिल है।
आप अपने ब्राउज़र के विकास टूल में अनुरोध देखकर देख सकते हैं कि कौन से शीर्षलेख भेजे जा रहे हैं। यहाँ एक उदाहरण है। जैसा कि आप देख सकते हैं, हेडर कुछ भी जादुई नहीं हैं। वे एक निश्चित तरीके से केवल टेक्स्ट स्वरूपित होते हैं।
आपके ऐप में हेडर कैसे नहीं भेजे जाते हैं
यदि आपने कभी रैक ऐप लिखा है, तो आपने शायद env
. देखा होगा हैश, जिसमें ऐप के पर्यावरण चर शामिल हैं। यदि आप इसके अंदर एक नज़र डालें, तो आप देखेंगे कि सामान्य सिस्टम पर्यावरण चर के अतिरिक्त, इसमें सभी अनुरोध शीर्षलेख भी शामिल हैं।
# config.ru
run lambda { |env| [200, {"Content-Type" => "text/plain"}, [env.inspect]] }
# Outputs:
# { "HTTP_HOST"=>"localhost:9000", "HTTP_CONNECTION"=>"keep-alive", "HTTP_PRAGMA"=>"no-cache", "HTTP_CACHE_CONTROL"=>"no-cache", "HTTP_ACCEPT"=>"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "HTTP_UPGRADE_INSECURE_REQUESTS"=>"1", "HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36", ... }
यह नहीं है कैसे nginx आपके ऐप में हेडर पास करता है। :)पी>
एप्लिकेशन सर्वर
आजकल, अधिकांश रूबी वेब ऐप यूनिकॉर्न जैसे एप्लिकेशन सर्वर में चलते हैं। चूंकि ऐप सर्वर nginx द्वारा उत्पन्न नहीं होते हैं, इसलिए nginx अपने पर्यावरण चर सेट नहीं कर सकते हैं।
हेडर nginx से यूनिकॉर्न तक कैसे यात्रा करते हैं? सरल। जब nginx ऐप सर्वर को अनुरोध अग्रेषित करता है, तो यह संपूर्ण अनुरोध भेजता है - शीर्षलेख और सभी।
इसे प्रदर्शित करने के लिए, मैंने एक साधारण एप्लिकेशन सर्वर बनाया जो nginx द्वारा STDOUT को भेजने वाली हर चीज़ को डंप कर देता है।
require "socket"
# Create the socket and "save it" to the file system
server = UNIXServer.new('/tmp/socktest.sock')
# Wait until for a connection (by nginx)
socket = server.accept
# Read everything from the socket
while line = socket.readline
puts line.inspect
end
socket.close
यदि आप यूनिकॉर्न के बजाय इस सर्वर से कनेक्ट करने के लिए nginx को कॉन्फ़िगर करते हैं, तो आप देखेंगे कि ऐप सर्वर को वास्तव में कौन सी जानकारी भेजी जा रही है:बस एक सामान्य HTTP अनुरोध। शीर्षलेख और सभी।
<ब्लॉकक्वॉट>
एक साधारण अपस्ट्रीम ऐप सर्वर लिखने के तरीके के बारे में अधिक जानकारी के लिए, यूनिक्स सॉकेट पर मेरी पोस्ट देखें।
फिर पर्यावरण चर से परेशान क्यों हैं?
1993 में, एनएससीए ने "कॉमन गेटवे इंटरफेस" या संक्षेप में सीजीआई नामक किसी चीज़ के लिए एक स्पेक प्रकाशित किया।
यह अपाचे जैसे सर्वरों के लिए गतिशील वेबपेज बनाने के लिए डिस्क पर मनमाने प्रोग्राम चलाने का एक तरीका था। एक उपयोगकर्ता एक पृष्ठ का अनुरोध करेगा, और अपाचे सचमुच खोल देगा और परिणाम उत्पन्न करने के लिए एक प्रोग्राम चलाएगा। चूंकि अपाचे ने सीधे ऐप्स को जन्म दिया, यह उनके पर्यावरण चर सेट कर सकता था।
CGI मानक निर्दिष्ट करता है कि HTTP हेडर को पर्यावरण चर के रूप में पारित किया जाना है। और मौजूदा पर्यावरण चर के साथ किसी भी नामकरण टकराव से बचने के लिए, यह निर्दिष्ट करता है कि "HTTP_" को नाम से जोड़ा जाना चाहिए।
तो आप पर्यावरण चर के एक समूह के साथ समाप्त हो जाते हैं जो इस तरह दिखते हैं:
HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"
HTTP_ACCEPT_ENCODING="gzip, deflate"
HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"
HTTP_CONNECTION="keep-alive"
HTTP_HOST="example.com"
HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0"
आजकल शायद ही कोई नए विकास के लिए सीजीआई का उपयोग करता है, लेकिन एचटीटीपी हेडर को पर्यावरण चर के रूप में संग्रहीत देखना अभी भी बहुत आम है - भले ही वे कभी-कभी नकली पर्यावरण चर होते हैं।
ऐप सर्वर इसे कैसे नकली बनाते हैं
एप्लिकेशन सर्वर कच्चे HTTP अनुरोध से हेडर को पार्स करते हैं। तो वे पर्यावरण में कैसे आते हैं? खैर, ऐप सर्वर उन्हें वहां रखता है।
मैंने वेबब्रिक में थोड़ा खोदा और धूम्रपान करने वाली बंदूक को खोजने में सक्षम था:
self.each{|key, val|
next if /^content-type$/i =~ key
next if /^content-length$/i =~ key
name = "HTTP_" + key
name.gsub!(/-/o, "_")
name.upcase!
meta[name] = val
}
आखिरकार, इन "नकली" पर्यावरण चर को अन्य वास्तविक पर्यावरण चर के साथ विलय कर दिया जाता है और आपके रैक ऐप और रेल में पास कर दिया जाता है, जो उन्हें पर्यावरण हैश से वापस ले जाता है। :)पी>