2008-11-21 7 views
6

J'essaye de mettre en place apache au lieu de IIS parce que IIS needlessly crashes tout le temps, et ce serait bien d'avoir mon propre contrôle de la source au lieu de nous tous éditant un contrôle commun.Pourquoi ai-je besoin de générer explicitement l'en-tête HTTP pour IIS mais pas pour Apache?

Dans IIS, nous doit faire quelque chose comme ça au début de chaque fichier:

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

alors qu'avec apache, nous devons laisser tomber le 200 ligne OK. Les travaux suivants avec les deux:

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

Quelqu'un peut-il expliquer pourquoi? Et j'étais sous l'impression que le module CGI était supposé comprendre ces types de détails automatiquement ...

Merci!

Mise à jour: Le droit d'accès est bon, nph corrige le problème pour IIS, mais il est toujours cassé pour Apache. Je ne pense pas que ça vaut la peine d'avoir des conditionnels partout dans le code, donc je vais m'en tenir à la dernière méthode, qui fonctionne avec et sans nph.

+0

Peut-être que IIS est confus parce que votre sortie vient directement de la variable d'entrée? ;-) – innaM

Répondre

14

HTTP et CGI sont des choses différentes. Le module CGI Perl appelle ce qu'il appelle un "en-tête HTTP", mais il s'agit simplement d'un en-tête CGI que le serveur doit réparer avant de revenir au client. Ils se ressemblent beaucoup, c'est pourquoi les gens sont confus et pourquoi les docs de CGI.pm n'aident pas en les appelant la mauvaise chose. Apache corrige les en-têtes CGI pour les transformer en en-têtes HTTP, y compris en ajoutant la ligne d'état HTTP et tout ce dont il a besoin.

Si votre serveur Web ne corrige pas l'en-tête pour vous, il s'attend probablement à un «en-tête non analysé» dans lequel vous assumez la responsabilité de l'intégralité de l'en-tête. Pour faire cela dans CGI.pm, vous devez ajouter l'option -nph à votre appel à en-tête, et vous devez faire l'en-tête complet vous-même, y compris les en-têtes tels que Expires et Last-Modified. Voir les documents sous Creating a Standard HTTP Header. Vous pouvez activer NPH de trois façons:

use CGI qw(-nph) 

CGI::nph(1) 

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

Utilisez-vous une ancienne version d'IIS? CGI.pm utilisé pour activer la fonction NPH pour vous automatiquement IIS, mais maintenant cette ligne est commentée dans la source 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

je rencontre toujours ce problème avec ActivePerl 5,14 fonctionnant sous IIS 7 via ISAPI. Le ActivePerl 5.10 FAQ prétend que le problème est résolu (la FAQ 5.14 ne résout même pas le problème), mais cela ne semble pas être le cas et la définition de la clé de registre qu'ils suggèrent n'a aucun effet dans cet environnement.

L'utilisation de $ENV{PerlXS} eq 'PerlIS' pour détecter ISAPI et activer la clé NPH selon la FAQ susmentionnée semble fonctionner. Je piraté mon CGI.pm d'ajouter les deux dernières lignes ci-dessous sous l'ancien gestionnaire IIS:

# 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

J'ai eu le même problème avec perl (il était un DOS/Unix/Mac chose nouvelle ligne!)

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"; 
Questions connexes