Theo: Link in Perl generierter HTML-Seite

Hallo, Ihr Perl/HTML Experten,

mit Perl möchte ich eine HTML Seite generieren, in der ein Link auf ein lokales PDF verweist.
Das sieht in etwa so aus:

Test.pl

  
#!/usr/bin/perl  
#Ein erster Versuch!  
print "Content-type: text/html\n\n";  
print "<html><head><title>Hallo Welt!</title></head>\n";  
print "<body>";  
print "<h1>Hallo Welt!</h1>";  
print qq{<a href="file:///C:/Test/Test.pdf">Hier der Link zu einem PDF</a>};  
print "</body></html>\n";  

Wenn ich lokal im Browser http://localhost/cgi-bin/Test.pl
aufrufe wird mir die Seite wie gewünscht generiert. Doch wenn ich auf den Link klicke, sollte eigentlich das PDF aufgehen aber es passiert nichts.

Win7 64bit, Firefox 34.0.5 mit AddblockPlus und Flashblock
und ich verwende TinyWeb
Sind es Einstellungen im Firefox oder ist TinyWeb dafür nicht geeignet?

Ich stehe auf dem Schlauch.
Danke für Hinweise.

  1. ...noch was vergessen...

    Im Firefox habe ich noch das AddOn "NoScript".

    Doch wenn ich in der HTML-Seite z.B. einen Link zu einem anderen Perl-Skript generiere
    z.B.:

      
    <a href="http://localhost/cgi-bin/RenameFile.pl?C:/Test/Test.pdf>Rename</a>  
    
    

    Dann wird das Skript entsprechend einwandfrei ausgeführt.

  2. Moin Theo,

    Das …

    print qq{<a href="file:///C:/Test/Test.pdf">Hier der Link zu einem PDF</a>};

      
    ist ein Link auf eine lokale Datei im lokalen Kontext und kein Link ins Inter-/Intranet (also nicht übers HTTP). Dein Browser wird den Zugriff auf lokale Dateien verhindern und du willst vermutlich, dass der Server die Ressource ausliefert.  
      
    Viele Grüße,  
    Robert
    
    1. Hallo Robert,

      ja, das ist die Absicht. Die ganze Geschichte passiert nur auf meinem Rechner, ohne Internet. Die HTML Seiten, die ich mit dem Browser aufrufe, sind alle lokal gespeichert. Auch diejenigen HTML Seiten, die z.B. das Perl-Skript aufrufen und die "dynamische" Seite generieren. Doch die Hyperlinks auf der "dynamisch" generierten HTML-Seite funktionieren dann nicht mehr.
      Wenn ich das PDF statt in C:/Test/Test.pdf in dem Verzeichnis, welches als Localhost definiert ist abspeichere, funktioniert folgendes auch nicht:
      <a href="http://localhost/cgi-bin/Test.pdf">Test PDF</a>
      Dann kommt die Fehlermeldung
      "Internal Server Error: AcroRd32.exe" is a GUI application"

      Wer verhindert nun, dass das PDF angezeigt wird?
      Der Browser? Der TinyWeb Webserver?
      Wie, wo kann ich das abstellen?

      1. Moin Theo,

        Die ganze Geschichte passiert nur auf meinem Rechner, ohne Internet. Die HTML Seiten, die ich mit dem Browser aufrufe, sind alle lokal gespeichert. Auch diejenigen HTML Seiten, die z.B. das Perl-Skript aufrufen und die "dynamische" Seite generieren. Doch die Hyperlinks auf der "dynamisch" generierten HTML-Seite funktionieren dann nicht mehr.

        Über welches Protokoll rufst du deine Seiten generell auf, file oder http?
        Aus Sicherheitsgründen lassen Browser von HTTP aus kaum/keinen Zugriff auf file zu.

        Wenn ich das PDF statt in C:/Test/Test.pdf in dem Verzeichnis, welches als Localhost definiert ist abspeichere, funktioniert folgendes auch nicht:
        <a href="http://localhost/cgi-bin/Test.pdf">Test PDF</a>
        Dann kommt die Fehlermeldung
        "Internal Server Error: AcroRd32.exe" is a GUI application"

        Ich weiß nicht, wie dein Webserver an dieser Stelle konfiguriert ist, interpretiere die Fehlermeldung zusammen mit dem Pfad allerdings so, dass der Webserver versucht, die PDF-Datei als CGI-Programm auszuführen, als „Interpreter“ AcroRd32.exe findet und dann stolpert. Was passiert denn, wenn du die PDF-Datei ins so genannte Document Root legst, also zu deinen HTML-Dateien (der URI sollte dann ungefähr so aussehen: http://localhost/evtl/noch/ordner/Test.pdf)?

        Viele Grüße,
        Robert

        1. Servus Robert,
          ok... habe noch ein bisschen rumprobiert.
          Ich darf die PDF Dateien nicht in http://localhost/cgi-bin/ ablegen. Da gibt's den Internal Server Error.
          Aber mit "http://localhost/SubDir1/SubDir2/SubDir3/Test.pdf" funktionierts.

          Dumm, dass meine PDFs nicht in einem Unterverzeichnis von "http://localhost/" sind.
          Wenn die PDFs z.B. in "C:/Test/Literatur/PDF/" sind und localhost als "C:/Software/Perl/" definiert ist, funktioniert ein "Trick" wie "http://localhost/../../Test/Literatur/PDF/Test.pdf" nicht, das sei "forbidden".
          Also muss ich wohl das "localhost"-Verzeichnis umdefinieren, z.B. "C:/Test/".
          Danke für den Hinweis!

  3. hi Theo,

    print qq{<a href="file:///C:/Test/Test.pdf">Hier der Link zu einem PDF</a>};

    Schön, dass Du diese Schreibweise für Stringbegrenzer verwendest. Insbesondere deswegen, weil Du Dich für Klammern (s. Anm.) entschieden hast: Klammern haben den Vorteil, dass auch ein Editor die Stringbegrenzer (als korrespondierende Klammern) findet. Du kannst das ausbauen bzw. für die gesamte print-Ausgabe verwenden:

      
    # qq => $variablen werden interpoliert  
    # q  => $variablen werden nicht interpoliert  
    print qq(  
    Jede Menge Text  
    und  
    jede Menge Zeilen  
    Hugo heißt mit Nachname: $lastname  
    );  
    
    

    Mehr dazu in der Doku…

    Anmerkung: Ich hatte mal einen Kollegen, der fand es cool als Stringbegrenzer die Tilde zu verwenden print qq~mein text...~; und das auch bei mehrzeiligen Texten. Der kam wahrscheinlich aus der PHP-Fraktion ;)

    Schöne Grüße.