Manfred: help: perl kann kein print "Location: " ausführen??

perl.cgi-Rätsel in Apache Umgebung.

Ich habe im Verzeichnis "hugo" ein .htaccess dokument mit
 ErrorDocument 404   /cgi/perl.cgi

Dieses tut genau, was es soll, nämlich im Fall eines Aufruf eines nicht existierenden Dokuments das Programm perl.cgi aufrufen.

im Programm perl.cgi steht nichts anderes als

#!/usr/bin/perl -w
 print "Location: http://www.meineseite.com/error.shtml\n\n";
 exit(0);

Jetzt kommt das Rätsel:

ich gebe im Browser eine nicht existierende URL im Verzeichnis "hugo" ein, aber anstelle der Seite http://www.meineseite.com/error.shtml kommt nur eine leere Browserseite. Der Location Befehl in perl.cgi funkt also nicht. Wieso?

Der Data Stream zeigt folgendes:

Send data (245 bytes).
<00000000< GET /hugo/nixda.html HTTP/1.1
<0000001D< Host: http://www.meineseite.com/
<00000039< Accept: */*
<00000046< Accept-Language: de
<0000005B< Connection: Keep-Alive
<00000073< User-Agent: Mozilla/4.0 (compatible; MSIE 5.13; Mac_PowerPC)
<000000B1< UA-OS: MacOS
<000000BF< UA-CPU: PPC
<000000CC< Extension: Security/Remote-Passphrase
<000000F3<

Receive data (279 bytes).

00000000> HTTP/1.1 404 Not Found
00000018> Date: Sun, 21 Jul 2002 23:18:04 GMT
0000003D> Server: Apache/1.3.26 (Unix) FrontPage/5.0.2.2510 PHP/4.1.2
0000007A> Location: http://www.meineseite.com/error.shtml
000000A2> Keep-Alive: timeout=3, max=100
000000C2> Connection: Keep-Alive
000000DA> Transfer-Encoding: chunked
000000F6> Content-Type: text/plain
00000110>
00000112> 0
00000115>

dann kommt nichts mehr. weisse Seite.

Funktioniert nach einem .htaccess Aufruf der print "Location .." Befehl nicht mehr, weil der Apache vorher schon HTTP/1.1 404 Not Found gemeldet hat? Hintergrund; Ich will statische URLs angeben, deren Content aber durch ein perlskript dynamisch generiert wird.

  1. Moin,

    Funktioniert nach einem .htaccess Aufruf der print "Location .." Befehl nicht mehr, weil der Apache vorher schon HTTP/1.1 404 Not Found gemeldet hat?

    So in etwa. Der Browser macht die Umleitung zu dem im Location:-Header angegebenen URI nicht, wenn er einen 404-Statuscode kriegt. (RFC 2616, Abschnitt 14.30 liest sich als ob Location: nur für 201 und 3xx eine Bedeutung hat.)
    Lösung: Sende einfach einen anderen HTTP-Status damit der Browser die Umleitung automatisch ausführt. Aber Vorsicht: Wenn du keine 404-Statuscodes mehr rausgibst bringt dich das unter Umständen in Probleme, etwa mit Suchmaschinen.

    Für dein ursprüngliches Vorhaben gibt es sicher eine bessere Lösung. In http://forum.de.selfhtml.org/?m=96813&t=17280 ("Axel Napolitano:
    (PROGRAMMIERTECHNIK) DRINGEND: Brauche Hilfe bezüglich .htaccess" vom 16. Juli 2002, wird wahrscheinlich bald im Archiv landen) wird zum Beispiel ein ähnliches Vorhaben verfolgt. Auch kenne ich es von PHP, dass man ein PHP-Skript wie ein Verzeichnis ansprechen kann ( .../bla.php/blu/blubb, das .php kann man iirc sogar weglassen) womit das auch gehen sollte. Perl wird sicherlich sowas ähnliches kennen.

    --
    Henryk Plötz
    Grüße aus Berlin

  2. Aloha!

    Ich habe im Verzeichnis "hugo" ein .htaccess dokument mit
    ErrorDocument 404   /cgi/perl.cgi

    Dieses tut genau, was es soll, nämlich im Fall eines Aufruf eines nicht existierenden Dokuments das Programm perl.cgi aufrufen.

    im Programm perl.cgi steht nichts anderes als

    #!/usr/bin/perl -w
    print "Location: http://www.meineseite.com/error.shtml\n\n";
    exit(0);

    Wenn alles, was du tun willst, ein Redirect im Fehlerfall ist, warum machst du dann nicht einfach das hier:

    ErrorDocument 404 http://www.meineseite.com/error.shtml

    Die Angabe einer vollständigen URL erzeugt im Falle des Falles keinen Statuscode 404, sondern einen 302 Redirect auf die angegebene URL. Die URL erscheint dabei natürlich in der Browserzeile, und diverse Mechanismen von Suchmaschinen, die 404 auswerten würden, nun aber auf 302 treffen werden vermutlich deine Fehlerseite indizieren.

    Hintergrund; Ich will statische URLs angeben, deren Content aber durch ein perlskript dynamisch generiert wird.

    Dann willst du an der 404-Sache nicht rumschrauben! 404 ist dann, wenn der Server für die Ressoure nichts gefunden hat. Du willst aber was finden, nämlich deine Seite. Wäre dumm, wenn deine Methode funktionieren würde, aber Suchmaschinen aufgrund von 404 die Seite nicht indizieren.

    Informiere dich über URL-Rewriting. mod_rewrite ist sozusagen die Eierlegende Wollmilchsau, was die Umwandlung von Browser-URL in server-verwendbare URL angeht - alles ganz geheim im Hintergrund, wenn es sein soll.

    Beispielanwendung (habe ich gerade für eine Seite benutzt):
    RewriteEngine on

    Wenn die angeforderte Seite auf .html endet und existiert,

    dann /index.php aufrufen (Auswertung der abgerufenen Seite erfolgt dort)

    RewriteCond /pfad/zum/document_root/%{REQUEST_FILENAME} -f
    RewriteRule ^/(.*.html)$ /index.php

    Interessanterweise funktioniert das auch mit URL-Parametern - warum, hab ich noch nicht so ganz herausgefunden. Vermutlich werden die im ersten Teil der RewriteRule einfach nicht beachtet - ist ja kein Teil des Ressourcennamens, sondern nur eine Info für die Ressource.

    - Sven Rautenberg