2008-11-21 12 views
6

मैं आईआईएस के बजाय अपाचे सेट अप करने की कोशिश कर रहा हूं क्योंकि IIS needlessly crashes हर समय, और यह सामान्य होगा कि हम सभी सामान्य चेकआउट संपादित करने के बजाय स्रोत का अपना चेकआउट प्राप्त कर सकें।मुझे आईआईएस के लिए HTTP शीर्षलेख को स्पष्ट रूप से आउटपुट करने की आवश्यकता क्यों है, लेकिन अपाचे नहीं?

आईआईएस में हम कुछ इस तरह प्रत्येक फ़ाइल की शुरुआत में कार्य करना होगा:

use CGI; 
my $input = new CGI(); 
print "HTTP/1.0 200 OK"; 
print $input->header(); 

जबकि अपाचे के साथ हम बंद 200 ठीक लाइन छोड़ देना चाहिए। निम्नलिखित दोनों के साथ काम करता है:

use CGI; 
my $input = new CGI(); 
print $input->header('text/html','200 OK'); 

क्या कोई बता सकता है क्यों? और मैं इस धारणा के तहत था कि सीजीआई मॉड्यूल को इस प्रकार के विवरणों को स्वचालित रूप से समझना था ...

धन्यवाद!

अद्यतन: ब्रायन सही है, एनएफ आईआईएस के लिए समस्या को हल करता है, लेकिन यह अभी भी अपाचे के लिए टूटा हुआ है। मुझे नहीं लगता कि यह पूरे कोड में सशर्त होने के लायक है, इसलिए मैं केवल अंतिम विधि के साथ रहूंगा, जो एनएफ के साथ और बिना काम करता है।

+0

शायद आईआईएस उलझन में है क्योंकि आपका आउटपुट इनपुट वैरिएबल से बाहर आता है? ;-) – innaM

उत्तर

14

HTTP और CGI अलग-अलग चीजें हैं। पर्ल सीजीआई मॉड्यूल कॉल करता है कि यह "HTTP शीर्षलेख" करता है, लेकिन यह क्लाइंट पर वापस जाने से पहले सर्वर को ठीक करने के लिए वास्तव में केवल एक CGI शीर्षलेख है। वे बहुत समान दिखते हैं, यही कारण है कि लोग भ्रमित हो जाते हैं और CGI.pm दस्तावेज़ उन्हें गलत चीज़ कहकर क्यों मदद नहीं करते हैं।

अपाचे सीजीआई हेडर को HTTP शीर्षलेख में बनाने के लिए ठीक करता है, जिसमें HTTP स्थिति रेखा और कुछ भी आवश्यक हो सकता है।

यदि आप वेबसर्वर आपके लिए हेडर को ठीक नहीं कर रहे हैं, तो शायद यह "नो-पार्स हेडर" की अपेक्षा कर रहा है जहां आप पूरे शीर्षलेख की ज़िम्मेदारी लेते हैं। CGI.pm में ऐसा करने के लिए, आपको हेडर पर कॉल करने के लिए -nph विकल्प जोड़ना होगा, और आपको Expires और Last-Modified जैसे शीर्षलेखों सहित स्वयं को पूरा हेडर बनाना होगा। Creating a Standard HTTP Header के अंतर्गत दस्तावेज़ देखें। आप तीन तरीकों से एनपीएच चालू कर सकते हैं:

use CGI qw(-nph) 

CGI::nph(1) 

print header(-nph => 1, ...) 

क्या आप आईआईएस के पुराने संस्करण का उपयोग कर रहे हैं? CGI.pm आईआईएस के लिए अपने आप आपके लिए एनपीएच सुविधा को चालू करने के लिए इस्तेमाल किया, लेकिन अब है कि रेखा CGI.pm में स्रोत में बाहर टिप्पणी की है:

# This no longer seems to be necessary 
# Turn on NPH scripts by default when running under IIS server! 
# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; 
0

मैं अभी भी ActivePerl 5.14 के तहत चल साथ इस समस्या का सामना कर रहा हूँ आईएसएपीआई के माध्यम से आईआईएस 7। ActivePerl 5.10 FAQ का दावा है कि समस्या ठीक हो गई है (5.14 एफएक्यू इस मुद्दे को भी संबोधित नहीं करता है), लेकिन ऐसा लगता है कि इसका उपयोग करने वाले रजिस्ट्री कुंजी का उपयोग और सेटिंग इस वातावरण में कोई प्रभाव नहीं पड़ता है।

आईएसएपीआई का पता लगाने के लिए $ENV{PerlXS} eq 'PerlIS' का उपयोग करना और उपर्युक्त एफएक्यू के अनुसार एनपीएच कुंजी चालू करना प्रतीत होता है। मैं पुराने आईआईएस हैंडलर के तहत नीचे अंतिम दो पंक्तियों को जोड़ने के लिए मेरी CGI.pm काट दिया:

# This no longer seems to be necessary 
# Turn on NPH scripts by default when running under IIS server! 
# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; 
# Turn on NPH scripts by default when running under IIS server via ISAPI! 
$NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{PERLXS} eq 'PerlIS'; 
0

मैं पर्ल के साथ इसी तरह की समस्या थी (यह एक डॉस/यूनिक्स/मैक न्यू लाइन बात थी!)

binmode(STDOUT); 
my $CRLF = "\r\n"; # "\015\012"; # ^M: \x0D ^L: \x0A 
print "HTTP/1.0 200 OK",$CRLF if ($0 =~ m/nph-/o); 
print "Content-Type: text/plain".$CRLF; 
print $CRLF; print "OK !\n"; 
संबंधित मुद्दे

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