Referenzen in Perl-Skripten werden nicht erkannt
AXXCEL
- cgi
0 Michael Schröpl0 AXXCEL
0 Klaus Mock0 Peter Squentz
Hallo Welt!
Ich habe folgendes Problem, zu dem ich hier leider keine Lösung gefunden habe, sollte ich es übersehen haben, gib mir einen kleinen Hinweis:
In der Umgebung WinNT4.0, IIS4.0 sowie Perl 5.x werden Referenzen innerhalb von Perl-Skripten auf andere Dateien (z.B. html oder auch lib) nicht gefunden. Mit Apache1.3.12 hatte ich dieses Problem nicht.
Beispiel: Folgendes Skript (match.cgi) unterscheidet zwischen MAC- und WIN-user und liefert die jeweils passende Startseite (sollte). Entweder home_m.html oder eben home.html:
#!/usr/local/bin/perl
print "HTTP/1.0 200 OK\n";
print "Content-type: text/html\n\n\n";
$type = $ENV{'HTTP_USER_AGENT'};
if ($type =~ /Mac/i) {
open (PAGE, "../home_m.html");
while (<PAGE>)
{
print "$_";
}
close(PAGE);
} else {
open (PAGE, "../home.html");
while (<PAGE>)
{
print "$_";
}
close(PAGE);
}
<<<
match.cgi befindet sich im cgi-bin Verzeichnis, die beiden *.html Dateien eins darüber. Ich habe es auch schon mit absoluten Referenzen probiert, ohne Erfolg! Die Verbindung zwischen IIS und Perl müßte ok sein, da Tests wie >>> print "<p>Hello World!</p>"; <<<
funktionieren. Ich habe einen Bekannten, der ähnliches Problem hatte, sich dann aber für Apache und gegen M$ entschieden hat. Wer von Euch hat es sich nicht so einfach gemacht und hat die Lösung oder zumindest einen Lösungsansatz?
Dank & Gruß
AXXCEL :)
Hi,
In der Umgebung WinNT4.0, IIS4.0 sowie Perl 5.x werden Referenzen innerhalb von Perl-Skripten auf andere Dateien (z.B. html oder auch lib) nicht gefunden. Mit Apache1.3.12 hatte ich dieses Problem nicht.
das liegt nicht am Apache, sondern daran, daß Du dort *zufällig* eine Konfiguration hattest, bei der das klappte.
if ($type =~ /Mac/i) {
»» open (PAGE, "../home_m.html");
match.cgi befindet sich im cgi-bin Verzeichnis, die beiden *.html Dateien eins darüber.
Das Problem ist, daß sich "../" nicht auf das CGI-Verzeichnis bezieht, sondern auf das current directory des Prozesses, welcher Dein CGI-Skript ausführt. Wie dieses gesetzt ist, kannst Du nicht wissen - deshalb ist es reiner Zufall, ob Dein Verfahren klappt oder nicht.
Eine Methode, mit der Deine Idee zuverlässig funktionieren sollte, wäre, Dir vom Webserver den Pfadnamen Deines CGI-Skripts geben zu lassen, diesen in Perl zu zerlegen und daraus den Pfadnamen Deiner Dateien zu konstruieren.
Ob (und wie) Dein IIS4.0 diese Information liefert, weiß ich nicht; wie der Apache es tun würde, kannst Du in http://www.teamone.de/selfaktuell/artikel/schroepl03.htm#a18 nachlesen.
Ich habe es auch schon mit absoluten Referenzen probiert, ohne Erfolg!
Absolute *Pfade* würden auch funktionieren - Du darfst natürlich nicht Pfade und URLs durcheinander werfen.
mfG - Michael
Hi,
In der Umgebung WinNT4.0, IIS4.0 sowie Perl 5.x werden Referenzen innerhalb von Perl-Skripten auf andere Dateien (z.B. html oder auch lib) nicht gefunden. Mit Apache1.3.12 hatte ich dieses Problem nicht.
das liegt nicht am Apache, sondern daran, daß Du dort *zufällig* eine Konfiguration hattest, bei der das klappte.
if ($type =~ /Mac/i) {
»» open (PAGE, "../home_m.html");
match.cgi befindet sich im cgi-bin Verzeichnis, die beiden *.html Dateien eins darüber.Das Problem ist, daß sich "../" nicht auf das CGI-Verzeichnis bezieht, sondern auf das current directory des Prozesses, welcher Dein CGI-Skript ausführt. Wie dieses gesetzt ist, kannst Du nicht wissen - deshalb ist es reiner Zufall, ob Dein Verfahren klappt oder nicht.
Eine Methode, mit der Deine Idee zuverlässig funktionieren sollte, wäre, Dir vom Webserver den Pfadnamen Deines CGI-Skripts geben zu lassen, diesen in Perl zu zerlegen und daraus den Pfadnamen Deiner Dateien zu konstruieren.
Ob (und wie) Dein IIS4.0 diese Information liefert, weiß ich nicht; wie der Apache es tun würde, kannst Du in http://www.teamone.de/selfaktuell/artikel/schroepl03.htm#a18 nachlesen.
danke für den tip, das werde ich mal probieren!
Ich habe es auch schon mit absoluten Referenzen probiert, ohne Erfolg!
Absolute *Pfade* würden auch funktionieren - Du darfst natürlich nicht Pfade und URLs durcheinander werfen.
Jupp, da hast du recht, dass man das durcheinander bringen kann. Ich habe daher beides probiert - ohne Erfolg!
Hallo,
Soweit ich weiß, Läuft das Perlscript in dem Ordner, welches als Virtuelles Verzeichnis angegeben wurde. Daher kann es sein, daß wenn Deine Scripts im URL '/cgi-bin' liegen, welches ein physikalischer Unterordner von '/' ist, daß das script quasi auch in '/' ausgeführt wird.
Testen kannst Du es einfach, in dem Du irgendwie überprüfst, in welchem Verzeichnis Dein Script gerade läuft. Vielleicht gibt Du einfach mal den Inhalt des Verzeichnisses aus, dann siehst Du ja, wo Du bist.
Als Abhilfe kannst Du z.B. ein weiteres virtuelles Verzeichnis definieren, Damit die Scripts dann auuch wirklich im Scripts-Ordner ausgeführt werden.
Grüße
Klaus
#!/usr/local/bin/perl
#!/usr/local/bin/perl -w
Das zeigt Dir dumme Fehler an.
print "HTTP/1.0 200 OK\n";
print "Content-type: text/html\n\n\n";$type = $ENV{'HTTP_USER_AGENT'};
if ($type =~ /Mac/i) {
»» open (PAGE, "../home_m.html");
open PAGE, '/bla/bla/home_m.html' or die "Kann home_m.html nicht oeffnen: $!";
Benutze absolute Pfade und teste *immer* den Rueckgabewert.
»» while (<PAGE>)
»» {
print "$_";
»» }
print <PAGE>;
»» close(PAGE);
} else {
»» open (PAGE, "../home.html");
open PAGE, '/bla/bla/home.html' or die "Kann home.html nicht oeffnen: $!";
»» while (<PAGE>)
»» {
print "$_";
»» }
print <PAGE>;
»» close(PAGE);
}
Peter