Christoph Schnauß: Ärger mit dem CGI-Modul

hallo Forum,

ich möchte mir von einem Script eine Seite schreiben und als *.htm-Datei abspeichern lassen. Das tut es auch. Wenn ich mir diese generierte Seite aber danach anzeigen lassen möchte, kommt eine (eigentlich bekannte) Fehlermeldung:
  Parse error: syntax error, unexpected T_STRING in I:\prog\perl\test.htm on line 1
In aller Regel deutet sowas darauf hin, daß irgendwo ein Anführungszeichen zuviel ist oder so etwas - jedenfalls dann, wenn man sich die Seite generieren und nur anzeigen läßt. Ich kann sowas aber nicht finden, außerdem gehts nicht um eine temporäre Anzeige, sondern die Seite existiert bereits statisch. Und im log steht gar nix, mein Script ist bugfrei.
Zeile 1 und die nachfolgenden sehen so aus:
  <?xml version="1.0" encoding="iso-8859-1"?>
  <!DOCTYPE html
   PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
Der restliche Seiteninhalt ist lediglich ein "hallo Welt!". Und wenn ich diese gespeicherte Seite durch den Validator jage, gibts ein freundliches Schulterklopfen: alles valide. Rufe ich die Seite mit einem Browser lokal auf, ohne Vermittlung meines virthost, wird sie auch brav angezeigt. Und wenn ich sie in das root-Verzeichnis eines anderen virthost kopiere, kriege ich sie ebenfalls zu sehen, ohne Fehlermeldung.

Mir fehlt da ein Stück Verständnis. Wenn ich meinem Script sage, daß es die Seite nicht speichern, sondern einfach bloß anzeigen soll, tuts das nämlich. Mit exakt demselben Header - das CGI-Modul erzeugt halt XHTML 1.0, wogegen ich im Prinzip nix einzuwenden habe. Es gibt nur eine Winzigkeit, wodurch sich die Befehle für "anzeigen lassen" und "speichern" unterscheiden müssen. Will ich bloß eine temporäre Anzeige, gebe ich an
  print $cgi->header().$cgi->start_html(...);
damit das Script weiß, daß es (X)HTML ausliefern soll. Will ich eine Datei speichern lassen, gebe ich nur an
print $cgi->start_html();
weil ich sonst als erste Zeile in der neuen Datei ein "Content-type: text/html" stehen habe, was da nicht hingehört.

Und wie kommen meine Browser nun alle auf die Idee, daß da irgendetwas an einer fertigen XHTML-Datei, die valide ist, einen Parse-Error ergeben muß, obwohl exakt dieselbe Datei sich über einen anderen virthost oder einen lokalen Aufruf problemlos darstellen läßt?

Grüße aus Berlin

Christoph S.

  1. Hi,

    Zeile 1 und die nachfolgenden sehen so aus:
      <?xml version="1.0" encoding="iso-8859-1"?>

    wird das Dokument zufällig durch einen PHP-Interpreter geparst, der das "<?" als Einstieg eines PHP-Code-Bereiches ansieht und mit dem folgenden "xml" nichts anfangen kann? Die Fehlermeldung kenne ich jedenfalls von PHP, nicht von Perl.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. hallo Cheatah,

      wird das Dokument zufällig durch einen PHP-Interpreter geparst, der das "<?" als Einstieg eines PHP-Code-Bereiches ansieht

      Die Vermutung hat was für sich - ich habe übrigens über Google auch nur Verweise zu irgendwelchen PHP-Boards gefunden. Und mein Perl-Script wird aus einer PHP-Seite heraus aufgerufen. Aber da tut es noch gar nix, insbesondere speichert es zu diesem Zeitpunkt noch nichts. Es müssen ja erstmal Eintragungen vorhanden sein, die zu speichern sind, und die werden nun nicht von PHP, sondern von Perl vorgenommen. Und ich wüßte nicht, warum mein Apache *.htm-Dateien durch den PHP-Parser jagen sollte, jedenfalls hab ich ihm sowas nicht befohlen.
      Außerdem: ist die Datei einmal gespeichert, kann ich ja alle meine Browser zumachen, Cache auskehren, Apache runterfahren, logs saubermachen/löschen, wieder hochfahren  -  und die *.htm-Seite ohne Zwischenschritt über eine PHP-Seite aufrufen. Da ist PHP also noch gar nicht in Gang gesetzt. Das Ergebnis ist aber dasselbe.

      Grüße aus Berlin

      Christoph S.

      1. Hi,

        Und mein Perl-Script wird aus einer PHP-Seite heraus aufgerufen. Aber da tut es noch gar nix, insbesondere speichert es zu diesem Zeitpunkt noch nichts. Es müssen ja erstmal Eintragungen vorhanden sein, die zu speichern sind, und die werden nun nicht von PHP, sondern von Perl vorgenommen. Und ich wüßte nicht, warum mein Apache *.htm-Dateien durch den PHP-Parser jagen sollte, jedenfalls hab ich ihm sowas nicht befohlen.

        tja, ich glaube Dir Deine Ungläubigkeit ;-) aber sehen wir uns noch mal die Tatsachen an:

        "Parse error: syntax error, unexpected T_STRING in I:\prog\perl\test.htm on line 1"

        Dies ist eine PHP-Fehlermeldung. Sie sagt, dass beim Parsen der test.htm in Zeile 1 ein Fehler aufgetreten ist. Das bedeutet schon mal, dass die Datei test.htm PHP-geparst wird :-) wofür Du nur noch den Grund finden müsstest. Ich sehe jedenfalls weder einen Zusammenhang zum Perl-Script (es sei denn, es führt irgendwo einen HTTP-Request o.ä. aus), noch zum Aufruf des Perl-Scripts durch ein PHP-Script. Meine Unterstellung lautet, dass das Problem im Moment des Aufrufs der Ergebnisseite durch den Browser (oder womit auch immer) auftritt.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. hi,

          Ich sehe jedenfalls weder einen Zusammenhang zum Perl-Script (es sei denn, es führt irgendwo einen HTTP-Request o.ä. aus)

          Das tut es. Der Aufruf soll (aus Bequemlichkeit, wenn du so möchtest) über ' print "Location: $url\n\n" ' erfolgen. Aber: ich kann mir ja den Pfad, in diesem Fall "http://www.perltest.test/ablage/test.htm" auch hernehmen, ihn auf einem anderen Netzwerkrechner in die Adreßzeile eintippen und kriege immer noch die Fehlermeldung.

          Trotzdem ist der Hinweis wahrscheinlich irgendwie zielführend. Hab meinen Apache jetzt mal ohne PHP-Unterstützung gestartet. Siehe da, da zeigt der IE das Ding an, aber mozilla (selbstverständlich ebenfalls mit ausgekehrtem Cache) tuts nicht, sondern fragt auf einmal, was er damit machen soll.

          In der Konfiguration für meinen virtuellen Host steht nur
             AddType application/x-httpd-php .php
          Also nix davon, daß er *.htm mit PHP parsen soll.

          Grüße aus Berlin

          Christoph S.

          1. Hi,

            Ich sehe jedenfalls weder einen Zusammenhang zum Perl-Script (es sei denn, es führt irgendwo einen HTTP-Request o.ä. aus)
            Das tut es. Der Aufruf soll (aus Bequemlichkeit, wenn du so möchtest) über ' print "Location: $url\n\n" ' erfolgen.

            naja, dann führt nicht das Perl-Script den HTTP-Request aus, sondern der Browser, der (über den Server) das Perl-Script aufgerufen hat.

            Trotzdem ist der Hinweis wahrscheinlich irgendwie zielführend. Hab meinen Apache jetzt mal ohne PHP-Unterstützung gestartet. Siehe da, da zeigt der IE das Ding an, aber mozilla (selbstverständlich ebenfalls mit ausgekehrtem Cache) tuts nicht, sondern fragt auf einmal, was er damit machen soll.

            Dann ist .htm mit keinem oder einem falschen Content-Type verknüpft. Ein deutliches Zeichen dafür, dass meine These stimmt; denn der PHP-Interpreter liefert defaultmäßig text/html aus.

            In der Konfiguration für meinen virtuellen Host steht nur
               AddType application/x-httpd-php .php
            Also nix davon, daß er *.htm mit PHP parsen soll.

            Ich kann Dir leider nicht sagen, welche Direktiven noch für diesen Fall interessant sind - was PHP betrifft bin ich da nie richtig durchgestiegen, und es mangelte dann auch am Interesse. Ich unterstelle aber weiterhin ein Konfigurationsproblem. Es muss übrigens nicht zwangsläufig in der httpd.conf bestehen.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. hallo Cheatah,

              Dann ist .htm mit keinem oder einem falschen Content-Type verknüpft.
              [...]
              Ich unterstelle aber weiterhin ein Konfigurationsproblem. Es muss übrigens nicht zwangsläufig in der httpd.conf bestehen.

              Recht hast du. Es war nicht einmal der Apache dran schuld, sondern der gleichzeitig mit ihm startende Tomcat, mit dem ich mich in nächster Zeit bissel gründlicher befassen will. Wenn ich den deaktiviere, gehts alles wie erwartet. Jetzt muß ich bloß noch herausfinden, wo und wie der dazwischengefunkt haben kann, das Ding kann ich noch nicht wirklich zuverlässig konfigurieren (ich wollte prüfen, ob ich mit dem gleichzeitigen Einsatz von Apache/mod_perl und Tomcat sowohl Perl-Code wie auch Java-Code in ein HTML-File stopfen kann und hatte die "Katze" jetzt schlicht vergessen). "falscher Content-Typ" war das Stichwort, das ich gebraucht habe.

              Grüße aus Berlin

              Christoph S.

              1. Hi,

                Recht hast du. Es war nicht einmal der Apache dran schuld, sondern der gleichzeitig mit ihm startende Tomcat,

                ah, Du stichst in offene Wunden :-)

                das Ding kann ich noch nicht wirklich zuverlässig konfigurieren

                Tomcat mag ein netter Container für so manches sein, aber ich finde ihn von der Nutzbarkeit einfach nur furchtbar. Ich bin gerne bereit zuzugeben, dass diese Meinung daher kommt, dass ich mich bisher meist mit einem "Hoppla, es funktioniert - bloß nicht wieder anfassen!" begnügt habe; aber wir haben bei uns im Haus einige, die das Ding seit Jahren in- und auswendig kennen und sich nicht wesentlich anders verhalten haben. Deren Vorteil bestand eher darin, von den vielen, vielen Konfigurationsstellen öfter die richtige zu erahnen.

                (ich wollte prüfen, ob ich mit dem gleichzeitigen Einsatz von Apache/mod_perl und Tomcat sowohl Perl-Code wie auch Java-Code in ein HTML-File stopfen kann und hatte die "Katze" jetzt schlicht vergessen).

                Müsste mit Apache 2.0 gehen, aber um das Thema habe ich mich noch nicht gekümmert.

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes