2008-11-21 9 views
6

Estoy tratando de configurar Apache en lugar de IIS porque IIS needlessly crashes todo el tiempo, y sería bueno poder tener mi propia verificación de la fuente en lugar de que todos editemos una salida común.¿Por qué tengo que generar explícitamente el encabezado HTTP para IIS pero no para Apache?

En IIS que debe hacer algo como esto al comienzo de cada archivo:

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

mientras que con Apache que debemos dejar fuera de la línea de 200 OK. Lo siguiente funciona con ambos:

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

¿Alguien puede explicar por qué? Y tenía la impresión de que se suponía que el módulo CGI debía resolver automáticamente este tipo de detalles ...

¡Gracias!

Actualización: brian tiene razón, nph soluciona el problema de IIS, pero todavía está roto para Apache. No creo que valga la pena tener condicionales en todo el código, así que me quedaré con el último método, que funciona con y sin nph.

+0

¿Quizás IIS está confundido porque su salida viene directamente de la variable de entrada? ;-) – innaM

Respuesta

14

HTTP y CGI son cosas diferentes. El módulo Perl CGI llama a lo que hace un "encabezado HTTP", pero en realidad es solo un encabezado CGI para que el servidor lo arregle antes de volver al cliente. Se parecen mucho, razón por la cual la gente se confunde y por qué los documentos CGI.pm no ayudan llamándolos equivocadamente.

Apache arregla los encabezados CGI para convertirlos en encabezados HTTP, incluida la adición de la línea de estado HTTP y cualquier otra cosa que pueda necesitar.

Si su servidor web no está arreglando el encabezado para usted, probablemente esté esperando un "encabezado sin análisis" en el que se responsabilice por el encabezado completo. Para hacer eso en CGI.pm, debe agregar la opción -nph a su llamada al encabezado, y debe crear el encabezado completo usted mismo, incluyendo encabezados como Expires y Last-Modified. Consulte los documentos bajo Creating a Standard HTTP Header. Puede activar NPH de tres maneras:

use CGI qw(-nph) 

CGI::nph(1) 

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

¿Está utilizando una versión anterior de IIS? CGI.pm utiliza para activar la función de NPH de forma automática para IIS, pero ahora que línea se comenta en la fuente en 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

Todavía estoy experimentando este problema con ActivePerl 5.14 se ejecuta bajo IIS 7 a través de ISAPI. El ActivePerl 5.10 FAQ afirma que el problema está solucionado (las preguntas más frecuentes 5.14 ni siquiera abordan el problema), pero no parece ser así y establecer la clave de registro que sugieren utilizar no tiene ningún efecto en este entorno.

El uso de $ENV{PerlXS} eq 'PerlIS' para detectar ISAPI y encender la tecla NPH de acuerdo con las preguntas frecuentes antes mencionadas parece funcionar. Me han pirateado mi CGI.pm añadir las dos últimas líneas más adelante bajo el antiguo controlador de 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

tuve un problema similar con Perl (que era una cosa nueva línea de 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"; 
Cuestiones relacionadas