Auf die Sprünge helfen bei HTML und CSS

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 :wink:

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 :wink:

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 :wink:

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 Like

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 :wink:

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.