Pourquoi dois-je générer explicitement l’en-tête HTTP pour IIS mais pas Apache?

J’essaie de configurer apache au lieu de IIS car IIS se plante inutilement tout le temps, et ce serait bien de pouvoir avoir ma propre sortie de la source au lieu de tous les modifier.

Dans IIS, nous devons faire quelque chose comme ceci 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 la ligne 200 OK. Les œuvres suivantes fonctionnent avec les deux:

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

Quelqu’un peut-il expliquer pourquoi? Et j’avais l’impression que le module CGI était censé comprendre ce genre de détails automatiquement …

Merci!

Mise à jour : brian a raison, nph corrige le problème pour IIS, mais il est toujours cassé pour Apache. Je ne pense pas que cela vaille la peine d’avoir des conditionnels partout dans le code, alors je vais juste restr avec la dernière méthode, qui fonctionne avec et sans nph.

HTTP et CGI sont des choses différentes. Le module CGI Perl appelle ce qu’il fait un “en-tête HTTP”, mais il ne s’agit que d’un en-tête CGI que le serveur doit corriger avant de le renvoyer au client. Ils se ressemblent beaucoup, ce qui explique pourquoi les utilisateurs de CGI.pm ne sont pas aidés en les appelant à tort.

Apache corrige les en-têtes CGI pour en faire des en-têtes HTTP, notamment en ajoutant la ligne d’état HTTP et tout ce dont il pourrait avoir besoin.

Si votre serveur Web ne corrige pas l’en-tête pour vous, il attend probablement un “en-tête non analysé” où vous êtes responsable de l’entête entière. Pour ce faire dans CGI.pm, vous devez append l’option -nph à votre appel à l’en-tête et créer vous-même l’en-tête complet, y compris les en-têtes tels que Expires et Last-Modified . Voir les documents sous Création d’un en-tête HTTP standard . Vous pouvez activer NPH de trois manières:

 use CGI qw(-nph) CGI::nph(1) print header( -nph => 1, ...) 

Utilisez-vous une ancienne version d’IIS? CGI.pm activait automatiquement la fonctionnalité NPH pour IIS, mais cette ligne est maintenant mise en commentaire dans la source dans 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/; 

Je suis toujours confronté à ce problème avec ActivePerl 5.14 exécuté sous IIS 7 via ISAPI. La FAQ ActivePerl 5.10 affirme que le problème est résolu (la FAQ 5.14 ne résout même pas le problème), mais il ne semble pas l’être et la définition de la clé de registre à utiliser 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. J’ai piraté mon CGI.pm pour append 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'; 

J’ai eu un problème similaire avec perl (c’était une chose nouvelle ligne DOS / Unix / Mac!)

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