Hallo!
Ich habe wohl gerade eine Denkblockade. Ich hab hier ein HTML-Dokument, dass aus einem Perlskript generiert wird. Dazu gibt es in einer extra Datei noch CSS Anweisungen. Aus irgendeinem Grund ignoriert der Browser die CSS Datei.
Hier das HTML (vom W3C Validator für OK befunden):
Betriebsstellen
Abkürzung: Gef Gerasdorf
Und hier das CSS (ebenfalls validiert):
body{color:#000000;background-color:#fbfbfb;}
h1,h2,h3,h4,p {
font-family:Arial,sans-serif;
}
h1 {
font-size:26pt;
}
h2 {
font-size:21pt;
}
h3 {
font-size:16pt;
}
h4 {
font-size:13pt;
}
p {
font-size:13pt;
}
Was habe ich wo übersehen?
mfg
christoph
Hallo
Ich habe wohl gerade eine Denkblockade. Ich hab hier ein
HTML-Dokument, dass aus einem Perlskript generiert wird.
Glaskugel: der tatsächliche Pfad für die HTML-Datei ist
der Pfad des *Perl-Skripts*. Daher kann:
nicht funktionieren. Mach mal ins Perl-Skript sowas wie:
…
my $cssfile = ‚/css/screen.css‘; # enter correct path here
print qq{\n};
…rein.
Grüße
CMБ
Hallo!
Glaskugel: der tatsächliche Pfad für die HTML-Datei ist
der Pfad des *Perl-Skripts*. Daher kann:
nicht funktionieren.
Kannst du mir da bitte erklären warum das bei Perlskripten nicht geht?
Ich habe jetzt einen absoluten Verweis (/~christoph/screen.css) auf die CSS Datei gemacht und das geht. Aber geht das nicht vielleicht auch relativ?
mfg
christoph
Hallo
Kannst du mir da bitte erklären warum das bei Perlskripten
nicht geht?
Weil Perl-Skripte nicht in der $ENV{DOCUMENT_ROOT}
liegen.
Ich habe jetzt einen absoluten Verweis
(/~christoph/screen.css) auf die CSS Datei gemacht und das
geht. Aber geht das nicht vielleicht auch relativ?
Urg? Wenn *das* geht, ist einiges im Argen 
mach mal bitte ein:
[christoph.pl]
#!/usr/bin/perl
print "Content-type: text/plain\n\n", $ENV{DOCUMENT\_ROOT};
und schreib mam bitte, was dann auf der Seite bei
http://christophs-pc/cgi-bin/christoph.pl
erscheint.
Grüße
CMБ
Was habe ich wo übersehen?
mfg
christoph
Einer der häufigsten Fehler: Ist der Name der CSS-Datei richtig? Und zwar ganz genau! Groß- & Kleinschreibung?
Stimmt der Pfad? In deinem Beispiel muss sich die CSS-Datei im gleichen Verzeichnis wie die eigentliche Seite befinden.
Gruß Marcus
Hallo!
Urg? Wenn *das* geht, ist einiges im Argen 
Huch.
mach mal bitte ein:
[christoph.pl]#!/usr/bin/perl
print „Content-type: text/plain\n\n“, $ENV{DOCUMENT_ROOT}; und schreib mam bitte, was dann auf der Seite bei
http://christophs-pc/cgi-bin/christoph.pl
erscheint.
Bitte sehr, bitte gleich:
/usr/local/www/apache22/data
Aufgerufen habe ich die Seite mit „http://192.168.27.5/~christoph/cgi-bin/christoph.pl“.
mfg
christoph
Hallo
Urg? Wenn *das* geht, ist einiges im Argen 
Huch.
/usr/local/www/apache22/data
Aufgerufen habe ich die Seite mit
„http://192.168.27.5/~christoph/cgi-bin/christoph.pl“.
Aha! Dein Html-Verzeichnis *ist auch* /~christoph/ !
Dann ist die Angabe "/~christoph/screen.css korrekt.
Da das perl-File *nicht* in ~christoph liegt
( sondern in $ENV{SCRIPT_NAME} ), könnte es sonst
eben nur gefunden werden, wenn es (das css) ebenfalls
dort liegt.
Grüße
CMБ
Hallo!
Aha! Dein Html-Verzeichnis *ist auch* /~christoph/ !
Dann ist die Angabe "/~christoph/screen.css korrekt.
Das wird jetzt interessant…
Da das perl-File *nicht* in ~christoph liegt
( sondern in $ENV{SCRIPT_NAME} ), könnte es sonst
eben nur gefunden werden, wenn es (das css) ebenfalls
dort liegt.
Ursprünglich war es so, dass „short.pl“ in ‚~/public_html/cgi-bin/‘ gelegen ist. Im selben Ordner war auch die CSS Datei. Da hat es nicht funktioniert.
Dann habe ich die CSS eine Ebene nach oben verschoben und im Perl-Skript den absoluten Pfad eingetragen. Hier hat es dann funktioniert.
Wenn ich $ENV{SCRIPT_NAME} in christoph.pl einfüge, gibt er folgendes Verzeichnis aus: „/~christoph/cgi-bin/christoph.pl“.
mfg
christoph
Hallo
Ursprünglich war es so, dass „short.pl“ in
‚~/public_html/cgi-bin/‘ gelegen ist. Im selben Ordner war
auch die CSS Datei. Da hat es nicht funktioniert.
Ja, aber nur weil Dein Server per config verboten
bekommen hat, aus dem Verzeichnis /~christoph/cgi-bin/
irgenwelche Dateien direkt zu laden. Du kannst das
sehen, wenn Du im Brauser versuchst, die css-Datei direkt
aufzurufen (mach sie noch mal rüber) und dann gib mal
http://192.168.27.5/~christoph/ cgi-bin /screen.css
ein.
Dann habe ich die CSS eine Ebene nach oben verschoben und im
Perl-Skript den absoluten Pfad eingetragen. Hier hat es dann
funktioniert.
Ja, weil dieses Verzeichnis innerhalb der dem Server
erlaubten $ENV[DOCUMENT_ROOT}-Hierarchie liegt.
Das cgi-bin-Verzeichnis liegt zwar auch scheinbar
drin, dies wurde aber u.U. durch die cgi-bin-Deklaration
modifiziert (script-alias etc.).
Eine „standardartigere“-Verzeichnishierarchie würde etwa so aussehen:
/usr/local/www/apache22/data wobei eben /usr/local/www/apache22/data Dein "DocumentRoot" wäre.
> Wenn ich $ENV{SCRIPT\_NAME} in christoph.pl einfüge, gibt er
> folgendes Verzeichnis aus: "/~christoph/cgi-bin/christoph.pl".
Das kannst Du dann im Perl-Skript benutzen, um das Skript
sich selber aufrufen zu lassen :wink:
Grüße
CMБ
1 „Gefällt mir“
Hallo!
Ja, aber nur weil Dein Server per config verboten
bekommen hat, aus dem Verzeichnis /~christoph/cgi-bin/
irgenwelche Dateien direkt zu laden. Du kannst das
sehen, wenn Du im Brauser versuchst, die css-Datei direkt
aufzurufen (mach sie noch mal rüber) und dann gib mal
http://192.168.27.5/~christoph/ cgi-bin /screen.css
ein.
Habe ich grad ausprobiert, stimmt!
Das ist was Neues für mich. Bis jetzt hatte ich zwar schon öfters mit dem Apache zu tun (hin und wieder zusammen mit PHP). Aber das der Zugriff auf ‚cgi-bin‘ nicht erlaubt ist, bin ich nicht gekommen.
Eine „standardartigere“-Verzeichnishierarchie würde etwa so
aussehen:
/usr/local/www/apache22/data
wobei eben /usr/local/www/apache22/data Dein
„DocumentRoot“ wäre.
OK. Diese Datenstruktur wäre also für alle Dateien ideal, die direkt (oder per Unterorder) erreichbar sein sollen. Für meine privaten Versuche werde ich mir wohl so etwas nocheinmal in meinem Home-Verzeichnis erstellen.
Dazu noch eine Frage die grad aufgetaucht ist. Was ist der Unterschied zwischen CGI und mod-perl? Wann verwendet man was?
mfg
christoph
Hallo
Dazu noch eine Frage die grad aufgetaucht ist. Was ist der
Unterschied zwischen CGI und mod-perl?
Das ist hier schönbeschrieben:
http://de.wikipedia.org/wiki/Common_Gateway_Interface
Wann verwendet man was?
CGI ist nur eine Interfacebeschreibung, kann man mit allem
Möglichen machen. Du kannst auch ein shell-Skript oder ein
kompiliertes Fortran-Programm nach ins cgi-verzeichnis legen,
sofern dieses Programm die Parameter richtig lesen kann (GET
und POST) und seine Ausgabe mit einem korrekten http-Header
(„Content-type: …“) beginnt.
Da CGI-Programme jeweils in einer eigenen shell
laufen sind sie zwar voneinander abgeschirmt, laufen
aber ansonsten „kontextfrei“ (unabhängig von vorher-
gehenden Aufrufen).
mod_perl ist ein mit einer Apache-Instanz geladener
Perl-Interpreter, der über ein API (APR) mit dem
Apache-Kern direkt kommuniziert.
Rufst Du ein Perl-Programm im CGI-Modus auf, so lädt
der Webserver eine Shell, in der der Perl-Interpreter
und dann das Perl-Programm gestartet werden - unter
mod_perl lädt das bereits geladene Perl den Quelltext
Deines Skriptes und führt ihn sofort als Subroutine aus.
Perl kann sogar Module wie CGI, LWP usw. bei Apache-
start ‚preloaden‘, diese stehen dann sofort (ohne ‚use‘)
in Deinem Skript zur Verfügung.
Es kann hier schon mal ein Faktor 1000 in der
Geschwindigkeit der Seitenauslieferung auftreten.
Bezüglich Deines Programms im Perl-Brett könnte man
unter mod_perl das Array ‚@ausgabe‘ am Apache-Start
laden und dann mit jedem Aufruf der Seite benutzen.
Der Nachteil: wenn mehrere unterschiedliche Parteien
einen Webserver mit mod_perl benutzen, ist es schwieriger
die Instanzen der unterschiedlichen Leute voneinander zu
isolieren. Bei einer Situation wie „One man One server“
ist das sicher kein Problem …
Grüße
CMБ
Hallo,
Kannst du mir da bitte erklären warum das bei Perlskripten
nicht geht?
Weil Perl-Skripte nicht in der $ENV{DOCUMENT_ROOT}
liegen.
Was hat das damit zu tun?
Wenn man die Pfade relativ zum Perlscript angibt, funktioniert das auch.
Ich habe jetzt einen absoluten Verweis
(/~christoph/screen.css) auf die CSS Datei gemacht und das
geht. Aber geht das nicht vielleicht auch relativ?
Urg? Wenn *das* geht, ist einiges im Argen 
Falsch. Wenn es nicht ginge, wäre einiges im Argen.
Der Browser macht ein
GET /~christoph/screen.css
und bekommt die Datei. Den Browser muss nicht interessieren, ob das im document root liegt oder nicht, solange der Server die Datei liefert.
Irgendwie glaube ich, dass du dich gerade vollständig verrannt hast - nicht das Perlscript liest die Datei, sondern der Browser fordert sie in einem getrennten HTTP-Request an.
Grüße,
Moritz
Hallo Semjon!
Vielen Dank für deine Ausführungen. Jetzt ist mir so einiges klarer. War doch Neuland für mich, was ich da betreten habe.
mfg
christoph
P.S.: Und das nur, weil es mich an dem Tag nicht gefreut hat, Mechanik zu lernen.