Ich erbte Aufrechterhaltung eines selbst geschriebenen CGI-Anwendung ohne Dokumentation arbeiten und habe noch nie den Namen des Autors. Die Anwendung hat in Debian 8 nicht mehr funktioniert, aber in Debian 7 und CentOS 5 funktioniert. Die Hauptänderungen waren das Upgrade von Apache 2.2 (verwendet von Debian 7 & CentOS 5) auf Apache 2.4 (verwendet von Debian 8) und das Upgrade von perl 5,8 (in CentOS 5), die jeweils 5,14 Perl (in Debian 7) 5,20 bis perl. Der problematische Teil läuft darauf hinaus, das folgende Skript nach unten (a 302-Umleitung):302 Redirect von CGI-Skript gestoppt in Apache 2.4
#!/usr/bin/perl
$|=1; # activate auto-flushing of stdout
use strict;
use warnings;
my $CRLF = "\015\012";
print STDOUT "Status: 302 Moved Temporarily$CRLF" .
"Location: /does_not_matter$CRLF" .
"URI: /does_not_matter$CRLF" .
"Connection: close$CRLF" .
"Content-type: text/html; charset=UTF-8$CRLF$CRLF";
close STDOUT;
while(1) {
sleep 1;
}
Das beobachtete Verhalten ist, dass die Umleitung nie so lange den Client erreicht, wie das Skript noch wenn verwendet mit laufendem Apache 2.4, aber gibt es keine Fehlermeldung in Apache's error.log. Ich änderte den Client (Firefox, Chromium, wget), das Apache-Modul (mod_cgid & mod_cgi), schickte zusätzliche Header, die close STDOUT
entfernt, entfernt, um die $|=1
, ersetzte den $CRLF
mit \n
und machte das Skript Gabel und verlassen die Elternprozess (so dass Apache nicht mehr der Elternprozess ist), alles ohne Erfolg. Die einzigen Dinge, die funktioniert: Verwenden Sie Apache 2.2, schalten Sie das Skript in eine NPH-CGI-Skript (das komplette HTTP-Header senden hat, die Apache wird nicht in irgendeiner Weise ändern, auch wenn sie Fehler enthalten), machen das Skript Exit statt eine Endlosschleife eingeben. Ich habe über tcpdump bestätigt, dass die Pakete mit der Weiterleitung den Server tatsächlich nie verlassen, bevor das Skript beendet wird. Und von der Datumszeile in der Antwort und die Zeit der eventuellen Ankunft Ich erhalte, dass Apache meine Ausgabe sofort erhält (& fügt sofort die Datumszeile zu den Headern), aber sendet nicht die Antwort an den Client .
Kümmern Sie sich nicht um Antworten, ich dachte bereits die Lösung von mir selbst und wird eine Antwort schreiben. Ich möchte nur die Lösung verfügbar für andere, die das gleiche Problem auftreten können.