PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl Premature end of script headers



zoro729
03-01-2002, 18:27
Tach.





ich wollte mal ein wenig mit perl experimentieren. Hab als Workstation SuSE 7.2 mit perl, Apache und mod_perl





also mal ein tutorial gelesen und folgendes script als test.pl / test.cgi in /usr/local/httpd/cgi-bin gespeichert







#!/bin/perl

print "Content-Type:text/html\n\n";

print "hello";

wenn ihc nun aber http://127.0.0.1/cgi-bin/test.pl aufrufe, kommt nur Fehler

500 Internal server error....

wenn ich das script in der console mit

perl test2.pl

ausführe, funzt es einwandfrei.

was kann da der fehler sein????

thx. z. :(

deac
03-01-2002, 18:38
du musst es als cgi speichern.
oder du must den apache auch auf pl konfiguieren.
aber nimm lieber cgi.

zoro729
03-01-2002, 18:45
immernoch dasselbe.

in der error log steht





[Thu Jan 3 19:45:50 2002] [error] (13)Permission denied: exec of /usr/local/httpd/cgi-bin/test2.cgi failed
[Thu Jan 3 19:45:50 2002] [error] [client 127.0.0.1] Premature end of script headers: /usr/local/httpd/cgi-bin/test2.cgi

woanders hab ich dann gelesen, man soll chmod auf 755 machen, das hat aber auch nix geholfen :(

haegar
03-01-2002, 23:15
Stehen die Rechte auf 755 ??? Darf in dem Verzeichnis in dem Du das Script gepeichert hast CGI ausgeführt werden ?
Normalerweise ist der Pfad /usr/bin/perl oder ist das bei SuSE anders ????

HTH

zoro729
04-01-2002, 09:48
in der konsole kann man die scripte einwandfrei ausführen.



ich will die aber im web verwenden, und nicht nur inner konsole :(





und ich hab den chmod, wie schon gesacht auf 755 gemacht. dann kommt aber immernoch


500 Internal server errror





und in der error_log steht dann die fehlermeldung mit dem premature:( :(

sticky bit
04-01-2002, 13:58
Versuch es mal in der Konsole ohne perl auszuführen, also statt perl skript.pl nur skript.pl, ich tipp ja nämlich auch auf die falsche Shebang...

Oh, und wenns sies nicht ist, dann probier mal das


print "Content-Type: text/html\n\n";

mit einem Space nach dem Doppelpunkt!!!

zoro729
05-01-2002, 12:04
@bit

immernoch dasselbe prob :(:(

sticky bit
05-01-2002, 17:40
Dan liegts vielleicht an den Apache Einstellungen? Ist das ScriptAlias korrekt, hat dir cgi-bin Ausführungsrechte?

zoro729
05-01-2002, 17:52
also in der httpd.conf stehen folgende einträge:



#
# If mod_perl is activated, load configuration information
#
<IfModule mod_perl.c>
Perlrequire /usr/include/apache/modules/perl/startup.perl
PerlModule Apache::Registry

#
# set Apache::Registry Mode for /perl Alias
#
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
PerlSendHeader On
</Location>

#
# set Apache::PerlRun Mode for /cgi-perl Alias
#
<Location /cgi-perl>
SetHandler perl-script
PerlHandler Apache::PerlRun
Options ExecCGI
PerlSendHeader On
</Location>

</IfModule>




#
# Aliases: Add here as many aliases as you need (with no limit). The format is
# Alias fakename realname
#
<IfModule mod_alias.c>

#
# Note that if you include a trailing / on fakename then the server will
# require it to be present in the URL. So "/icons" isn't aliased in this
# example, only "/icons/"..
#
Alias /icons/ "/usr/local/httpd/icons/"

<Directory "/usr/local/httpd/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as applications and
# run by the server when requested rather than as documents sent to the client.
# The same rules about trailing "/" apply to ScriptAlias directives as to
# Alias.
#
ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/"

<IfModule mod_perl.c>
# Provide two aliases to the same cgi-bin directory,
# to see the effects of the 2 different mod_perl modes.
# for Apache::Registry Mode
ScriptAlias /perl/ "/usr/local/httpd/cgi-bin/"
# for Apache::Perlrun Mode
ScriptAlias /cgi-perl/ "/usr/local/httpd/cgi-bin/"
</IfModule>
#
# "/usr/local/httpd/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/httpd/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

</IfModule>
# End of aliases.


#
# set /cgi-bin for CGI execution
#
<Location /cgi-bin>
AllowOverride None
Options +ExecCGI -Includes
SetHandler cgi-script
</Location>


und nu?

wd
05-01-2002, 20:57
Um Apache-CGI zum Laufen zu bewegen, muessen folgende Einstellungen in der httpd.conf vorgenommen werden:

-----------------------------
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

Action application/x-httpd-cgi "/usr/bin/perl"

<Directory "/var/www/cgi-bin\">
Options ExecCGI Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
AllowOverride None
</Directory>

AddHandler cgi-script .cgi .pl
-----------------------------

Versuche anschliessend mal nach dem

print "Content-type: text/html", "\n\n";

drei mal Enter zu drücken (also drei Absätze einfügen).

Diese Einstellungen haben bei mir funktioniert.

zoro729
05-01-2002, 21:26
@wd, hab alles so geändert, wie du gesacht hast, und es kommt immernoch internal server error :(

haegar
09-01-2002, 12:49
Also wenn da ein Premature End of Script Headers kommt dann is mit dem apache schon mal alles ok. Der pfad zu Perl stimmt auch sonst käme ein InternalServer Error. Wie stehen denn die Rechte auf dem Verzeichnis cgi-bin ? Versuch mal 755 (funktioniert jedenfalls bei mir so).

Habs eben mal gecheckt.... dann kommt nur forbidden.....
also das isses dann wohl auch nich :(

lolli
09-01-2002, 13:19
in der regel gibt es zwei gründe für "premature end ....":

1. die datei ist fehlerhaft (kann ja ausgeschlossen werden)

2. die datei gibt VOR dem header bereits zeichen zurück, und der header wird als ungültig angesehen.

letzteres ist sicher die ursache. diese ausgabe entsteht aber auch, wenn die datei noch windows-zeilenumbrüche enthält.

wie hast du denn die test.pl erstellt? mit windows? wenn ja, musst du unbedingt die datei via ascii-mode im ftp-programm übertragen und besser noch dein editor so einstellen, dass er die datei mit unix-zeilenumbrüchen abspeichert und nicht mit den doofen win-dingern. (geht aber nur bei guten editoren)

poste doch einfach mal dein script!!!

(wenn du deine datei mit vi {vi test.pl} öffnest und dort ein ^M findest ist der winzeilenumbruch drin...)


oliver

zoro729
09-01-2002, 16:16
also ich hatte die datei mit quanta++ unter linux erstellt. und dann mit cp kopiert, dann rechte vergeben (chmod 755 test.pl), und dann mit via browser aufgerufen.







ich bekomme dann immernoch nen 500er :(



und in der apache error_log steht halt das mit dem premature...







axo:



das mit vi hab ich gemacht und da war kein win.zeilenumbruch drinn







script:










#!/usr/bin/perl -w


print("warum geht das nicht?");








wenn ich das script mit






perl ./test.pl



aufrufe wird mir in der konsole schön brav der text ausgegeben... nur via browser nicht :(

lolli
10-01-2002, 09:01
hättest du mal gleich dein skript gepostet:

#!/usr/bin/perl -w

print "Content-type: text/html\n\n";
# damit der browser weiss, was für daten ausgegeben werden

print("warum geht das nicht?<br>");
print "<h1>Weil du den HTML-Header vergessen hast!!!!</h1>";

zoro729
10-01-2002, 09:53
*grml*




das hatte weiter oben schonmal jemand gepostet, ich habs getestet und es ging nicht...




nun geht aber :) :) :)



thx.

btw:
ich hatte das script aus nem Tutorial und bin davon ausgegangen, dass es dann wenigstens funzen sollte....
das hat man nun davon, wenn man nen Tutorial liest ;)

lolli
10-01-2002, 10:13
nun, man sollte nur wissen, ob man sich in bereich für shell-skripte (ohne header) oder im cgi-bereich (mit header) befindet...

viel spass mit perl ;)


oliver