CGI script gibt Fehlermeldung!

Hallo,

Ich bin ein ziemlich CGI Neuling und habe folgendes Problem:

Ich bekomme vom Apache immer eine „internal Server Error“ wenn dieses Script läuft:


#!/usr/bin/perl
open(DATEI, „>Test.txt“)|| die „File nicht gefunden“;
print DATEI „test text“;
close(DATEI);

Lustigerweise wird das script aber scheinbar korrekt ausgeführt da sich der Text „test text“ danach tatsächlich im File „Test.txt“ befindet.

Wenn ich das script erweitere zb so:


#!/usr/bin/perl
open(DATEI, „>Test.txt“)|| die „File nicht gefunden“;
print „Content-type: text/html\r\n\r\n“;
print „\n“;
print „Hello World!\n“;
print „\n“;
print " Hallo Welt \n";
print „\n“;
print „\n“;
print DATEI „test text“;
close(DATEI);

exit (0);

Dann klappt alles ohne Fehlermeldung… einfach wenn ich diesen ganzen „Hallo Welt“ kram weglasse kommt wieder die Error-Meldung.

Was fehlt meinem kleinen miniscript?

Für jeden Tip äusserst Dankbar.

Gruss,
Oliver

Hallo,

Ich bekomme vom Apache immer eine „internal Server Error“ wenn

Was steht denn in der error.log des Servers?

dieses Script läuft:


#!/usr/bin/perl
open(DATEI, „>Test.txt“)|| die „File nicht gefunden“;
print DATEI „test text“;
close(DATEI);

Lustigerweise wird das script aber scheinbar korrekt
ausgeführt da sich der Text „test text“ danach tatsächlich im
File „Test.txt“ befindet.

Wenn ich das script erweitere zb so:


#!/usr/bin/perl
open(DATEI, „>Test.txt“)|| die „File nicht gefunden“;
print „Content-type: text/html\r\n\r\n“;
print „\n“;
print „Hello
World!\n“;
print „\n“;
print " Hallo Welt \n";
print „\n“;
print „\n“;
print DATEI „test text“;
close(DATEI);

exit (0);

Hehe, der Server erwartet ja auch, dass das Perlskript zumindest einen Header schreibt.
Noch ein Tipp für die Entwicklung von cgi-skripts: Verwende das Modul
use CGI::Carp qw(fatalsToBrowser);
Das hilft bei der Fehlersuche ungemein.

Grüße,
Moritz

Hallo Moritz,

Was steht denn in der error.log des Servers?

ächz, darauf hab ich leider keinen Zugriff…

Hehe, der Server erwartet ja auch, dass das Perlskript
zumindest einen Header schreibt.

OK, wie mache ich es dass das script im Hintergrund abläuft, also ohne dass da einen neue Seite generiert wird? Der user soll erst später per Button-Klick auf das erstellte .txt file zugreifen können.

Noch ein Tipp für die Entwicklung von cgi-skripts: Verwende
das Modul
use CGI::Carp qw(fatalsToBrowser);

Hab ich eingefügt, aber da kommt nichts… (bloss wieder der Server Error wenn ich den „hallo-welt“ teil weglasse…)

Das script an sich scheint ja zu laufen, aber ich will es einfach dazu bringen versteckt im Hintergrund abzulaufen…

Gruss,
Oliver

Hallo

Das script an sich scheint ja zu laufen, aber ich will es
einfach dazu bringen versteckt im Hintergrund abzulaufen…

Schick doch die selbe Seite einfach nochmal.
Mit oder ohne die kleine Ergänzung, dass
eben „erfolgreich“ ein Button gedrückt
wurde.

Wenn man den Rahmen nicht kennt, wozu das
gut sein soll, tut man sich schwer mit
„Hilfestellungen“ :wink:

Grüße

CMБ

Erläuterung :smile:

Wenn man den Rahmen nicht kennt, wozu das
gut sein soll, tut man sich schwer mit
„Hilfestellungen“ :wink:

Alles klar :wink:

Ich versuchs mal zu erklären:

Wir haben hier ein Ticketing-Tool (ARS Remedy). Auf einem Intranet-Server liegt eine „abgespeckte“ version des ARS-Datenbestandes in CSV-Format das mit einem CGI Script durchsucht werden kann. (Dient dazu dass man für einfach Searches nicht immer das ganze ARS Starten muss)
Nun gibt es die möglichkeit, sog. ARSTasks (ein reines Text-File mit ca 5 Steuer-Befehlen…) zu speichern mit denen man DIREKT ARS öffnen, und auf den entsprechenden Datensatz springen kann.
Die Idee ist nun, das wenn man auf dem Intranet-Server einen Datensatz gefunden hat, mittels eines Button ARS öffnen und direkt auf jenen Datensatz wechseln kann. (Wenn ich einen solchen ARSTask mittels href verlinke klappt das wunderbar, ARS geht auf und der Datensatz ebenfalls) Mein obiges CGI-Script soll also Jedesmal wenn jemand den „ARS-Button“ drückt automatisch diesn ARSTask generieren und ihn anschliessend „ausführen“.
Das automatische generieren funktioniert ja prinzipiell mit diesem Script… im moment hadere ich aber noch mit dem anschliessenden „Aufrufen“ des Files und eben damit, dass ich das Script im Hintergrund ablaufen lassen möchte, ohne das der User etwas davon mitkriegt.

Lange Rede, kurzer Sinn: HILFE!! :smiley:

Gruss,
Oliver :wink:

Hallo,

Nach deiner Erklaerung zu schliessen koennte dir ein redirect helfen:

use CGI;
my $q = new CGI;
print $q-\>redirect("http://domain.com/meineurl/")

wobei du natuerlich vor dem redirect noch andere Sachen berechnen kannst.

HTH,
Moritz

Auch Hallo,

Nach deiner Erklaerung zu schliessen koennte dir ein redirect
helfen:

Ja, und wie… :smiley: Danke für die Hilfe…

Soweit so gut… Das Script läuft jetzt ohne Fehler und alles wäre bestens… aaaber: Das erzeugte File lässt sich als hyperlink nicht ansprechen… wenn ich es manuell doppelklicke gehts. Wenn ich es manuell in den Browser ziehe gehts. Wenn ich es im Browser via File/open öffne gehts… aber wenn ich einen Hyperlink (oder ein Re-Direct) drauf mache wird das file vom ARS nicht erkannt…

ächz,

Danke Für Eure tolle Hilfe, aber scheinbar scheitert das ganze Projekt an der ARSBrowser Schnittstelle.

Gruss,
Oliver

ächz, noch mehr Probleme
Sorry wenn ich noch weiter nerve… aber…

Wenn ich redirecten will passiert folgendes:

bei

use CGI;
my $q = new CGI;
print $q-\>redirect("http://adresse.com")

Bekomme ich folgenden output:
Status: 302 Moved Location: http://adresse.com

und passieren tut nichts…

Wenn ich den Redirect so versuche:

print "Location: http://adresse.com\n\n";

Bekomme ich folgenden output:
Location: http://adresse.com

Wo ist der Hund begraben?

Vielen Dank für die Mühe,
Oliver

Das wird daran liegen, dass der Redirect die erste Ausgabe sein muss, die das Script erzeugt. Wenn du vorher zum Beispiel noch das „Content-type: text/html“ an den Browser schickst, wird das Folgende nun mal als HTML und nicht als HTTP-Statusinformation interpretiert und einfach im Browser angezeigt.
Dennis

Danke an alle, jetzt gehts.
Ich habe nun einfach ZWEI scripts. Das eine erstellt das file und ruft danach das zweite script mit dem Re-Direct auf. So klappt es wunderbar.

Vielen Dank und Gruss,

Oliver