Почему мне нужно явно выводить HTTP-заголовок для IIS, но не для Apache? - PullRequest
6 голосов
/ 21 ноября 2008

Я пытаюсь настроить apache вместо IIS, потому что IIS без необходимости все время вылетает , и было бы неплохо иметь возможность иметь собственную проверку источника вместо того, чтобы все мы редактировали общая касса.

В IIS мы должны сделать что-то подобное в начале каждого файла:

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

, тогда как в apache мы должны опустить строку 200 OK. Следующее работает с обоими:

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

Кто-нибудь может объяснить, почему? И у меня сложилось впечатление, что модуль CGI должен был автоматически определять такие детали ...

Спасибо!

Обновление : Брайан прав, nph исправляет проблему для IIS, но все еще не работает для Apache. Я не думаю, что стоит иметь условные обозначения во всем коде, поэтому я просто остановлюсь на последнем методе, который работает с и без nph.

Ответы [ 3 ]

14 голосов
/ 21 ноября 2008

HTTP и CGI - это разные вещи. Модуль Perl CGI называет то, что он делает, «HTTP-заголовком», но на самом деле это просто заголовок CGI, который сервер должен исправить, прежде чем он вернется к клиенту. Они похожи друг на друга, поэтому люди запутываются и почему документы CGI.pm не помогают, называя их неправильными вещами.

Apache исправляет заголовки CGI, превращая их в заголовки HTTP, включая добавление строки состояния HTTP и всего, что может понадобиться.

Если ваш веб-сервер не исправляет заголовок для вас, он, вероятно, ожидает "непроверенный заголовок", где вы берете на себя ответственность за весь заголовок. Чтобы сделать это в CGI.pm, вы должны добавить опцию -nph к вашему вызову заголовка, и вы должны сделать полный заголовок самостоятельно, включая заголовки, такие как Expires и Last-Modified. См. Документы в Создание стандартного заголовка HTTP . Вы можете включить NPH тремя способами:

use CGI qw(-nph)

CGI::nph(1)

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

Используете ли вы более старую версию IIS? CGI.pm раньше автоматически включал функцию NPH для IIS, но теперь эта строка закомментирована в источнике в 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 голосов
/ 13 августа 2016

У меня была похожая проблема с Perl (это была новая строка для 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";
0 голосов
/ 21 июня 2012

Я все еще испытываю эту проблему с ActivePerl 5.14, работающим под IIS 7 через ISAPI. ActivePerl 5.10 FAQ утверждает, что проблема исправлена ​​(FAQ 5.14 даже не решает проблему), но, похоже, это не так, и установка ключа реестра, который они предлагают использовать, не оказывает влияния в этой среде .

Использование $ENV{PerlXS} eq 'PerlIS' для обнаружения ISAPI и включения ключа NPH в соответствии с вышеупомянутым FAQ, похоже, работает. Я взломал свой CGI.pm, чтобы добавить последние две строки ниже под старым обработчиком 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';
...