David-GB: Link einfügen mit Dateienamen .pl.

Guten Morgen,

ich bin neu hier und habe auch gleich folgendes Problem. 😉

Ich möchte mit einem Script auf meiner Intranet Seite ein Verzeichnis auslesen.

Das Script:

<?php
$verzeichnis = openDir("dateien/Schulungen"); // Öffnet ein Unterverzeichnis mit dem Namen "daten"
while ($file = readDir($verzeichnis)) { // Verzeichnis lesen
if ($file != "." && $file != "..") { // Höhere Verzeichnisse nicht anzeigen!
echo iconv('ISO-8859-15', 'UTF-8', "&nbsp;<a href=\"dateien/Schulungen/$file\">$file</a><br>\n"); // Link erstellen
}
}
closeDir($verzeichnis); // Verzeichnis schließen
?>
<br>

Das Script fumktioniert soweit auch sehr gut. Das Problem ist das in den Ausgelesenen Dateien z.B. solche Dateienamen stehen:

RA.TR.PL.ADLER.1706.DE.pdf

Sobald ein .PL. im Dateinamen vorhanden ist bekomme ich eine Fehlermeldung

Serverfehler! Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist. Der Server ist entweder überlastet oder ein Fehler in einem CGI-Skript ist aufgetreten.

Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber. Error 500 verwaltung 06/21/17 11:59:09 Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1

Das ganze kann ich auf anderen Server gleichmaßen wiederholen. Das scheint etwas mit Peal zu tun tu haben. Was kann ich maachen damit ich auch solche Dateienamen aufrufen kann?

Viele Grüße

David

  1. Tach!

    $verzeichnis = openDir("dateien/Schulungen"); // Öffnet ein Unterverzeichnis mit dem Namen "daten"
    while ($file = readDir($verzeichnis)) { // Verzeichnis lesen
    if ($file != "." && $file != "..") { // Höhere Verzeichnisse nicht anzeigen!
    

    Stattdessen würde ich glob() in einem foreach nehmen. Die Punkte sind damit ohne Zutun nicht enthalten oder mit einem der Flags ausschließbar.

    Sobald ein .PL. im Dateinamen vorhanden ist bekomme ich eine Fehlermeldung

    Serverfehler! Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist. Der Server ist entweder überlastet oder ein Fehler in einem CGI-Skript ist aufgetreten.

    Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber. Error 500

    Den solltest du befragen. Wenn du selbst dieser bist, dann schau bitte ins ErrorLog des Webservers, was die genaue Ursache ist. Bei einem 500er wird nämlich nur nichtssagender Text an den Aufrufer gegeben, damit keine internen Informationen preisgegeben werden.

    Das scheint etwas mit Peal zu tun tu haben. Was kann ich maachen damit ich auch solche Dateienamen aufrufen kann?

    Erst die Ursache finden, dann kann man Maßnahmen passend zu dieser Ursache vorschlagen.

    dedlfix.

  2. Hello,

    Im Verzeichnis /etc/apache2/conf.d steckt vermutlich die Lösung.
    Da wurde ein Alias oder ein AliasMatch o. ä. vereinbart.

    Das gibt es bei Apache (leider) oft, wenn man sich jeden Müll reinlutscht als AddOn. Für den Pfadanteil /javascript gibt es sowas z. B., mitgebracht von NodeJS. Das hat mich mal einige Stunden gekostet herauszufinden, warum meine AJAX-Requests nicht funktionierten...

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  3. Ich sehe hier nichts, was einen Bezug zum Perl-Interpreter herstellen sollte. Du liest ein Verzeichnis und konvertierst die Namen von der Windows-Codepage in UTF-8.

    Ich frage mich allerdings, weshalb Du PHP 5.3.1 einsetzt. Möglicherweise ist hier ein Fehler in der iconv-Funktion oder im Verzeichnis-Iterator.

    Und Du solltest vom PHP Interpreter eine genauere Auskunft bekommen, über was er sich erbricht. Setze doch mal

    error_reporting(E_ALL);

    an den Beginn.

    Rolf

  4. Hallo David,

    Das Script:

    (… lässt sich mit Einrückungen besser lesen …)

    <?php
    $verzeichnis = openDir("dateien/Schulungen"); // Öffnet ein Unterverzeichnis mit dem Namen "daten"
    while ($file = readDir($verzeichnis)) { // Verzeichnis lesen
    if ($file != "." && $file != "..") { // Höhere Verzeichnisse nicht anzeigen!
    echo iconv('ISO-8859-15', 'UTF-8', "&nbsp;<a href=\"dateien/Schulungen/$file\">$file</a><br>\n"); // Link erstellen
    }
    }
    closeDir($verzeichnis); // Verzeichnis schließen
    ?>
    <br>
    

    … und hat ein paar Probleme:

    • Der in $file stehende Dateiname kann Zeichen enthalten, die im HTML-Kontext eine besondere Bedeutung haben. Du musst den Dateinamen daher mit htmlspecialchars escapen.
    • Deine Liste ist nicht als solche ausgezeichnet.
    • Was für ein Dateisystem verwendet denn ISO-8859-15 als Zeichenkodierung für die Dateinamen?

    Das Script fumktioniert soweit auch sehr gut. Das Problem ist das in den Ausgelesenen Dateien z.B. solche Dateienamen stehen:

    RA.TR.PL.ADLER.1706.DE.pdf

    Sobald ein .PL. im Dateinamen vorhanden ist bekomme ich eine Fehlermeldung

    Serverfehler! Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist. Der Server ist entweder überlastet oder ein Fehler in einem CGI-Skript ist aufgetreten.

    Hast du schon ins error.log deines Apachen geschaut? Da sollte der Grund für den Fehler stehen.

    Viele Grüße
    Robert

  5. Hello,

    
    > while ($file = readDir($verzeichnis)) { // Verzeichnis lesen
    > if ($file != "." && $file != "..") { // Höhere Verzeichnisse nicht anzeigen!
    
    

    Das kann auf jeden Fall noch Probleme geben mit Files, die "0" heißen und mit symbolischen Links.
    Im ersten Fall würde der Scan zu früh abgebrochen, im zweiten könnte es einen zirkulären Verlauf ergeben.

    Interessiert es Dich, wie man es besser machen könnte?

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
    1. Hallo Zusammen,

      vielen Dank für die vielen Antworten. Ich versuche mal alles zu beantworten 😂

      Error Log: Dort steht drin: (9)Bad file descriptor: don't know how to spawn child process: E:/wwwroot/intranet2/dateien/Schulungen/Test.PL.123.pptx, referer: http://verwaltung/intranet2/?page_id=1952

      Das ganze läuft mit Xampplite falls das wichtig ist. Auf Perl bin ich gekommen, weil es nur mit der zeichenfolge .pl. probleme gibt und .pl zu Perl gehört.

      1. Hello,

        für XAMPP-Lite kenne ich die Konfigurationsdateien nicht auswendig.
        Die sollte man aber kennen, wenn man es benutzt ;-)

        Aber suche doch bitte mal selber danach und dann identifiziere das AliasMatch für ".pl" oder ähnlich. Ich wette um eine Runde Weißbier, dass es daran liegt.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        1. Habe jetzt in der Datei C:\xampplite\apache\conf\httpd.conf

          nach .pl gesucht

          Dort den Eintrag: AddHandler cgi-script .cgi .pl .asp

          gefunden und dort das .pl rausgelöscht. Apache neugestartet und jetzt geht es 😂

          1. Tach!

            Dort den Eintrag: AddHandler cgi-script .cgi .pl .asp

            gefunden und dort das .pl rausgelöscht. Apache neugestartet und jetzt geht es 😂

            Mein Bauchgefühl sagt mir, dass das nicht die direkte Ursache gewesen ist. Das ist eher nur ein Glied, das die Verarbeitungskette unterbrochen hat. Andererseits wirst du wohl auch keinen Nachteil durch das Entfernen der Direktive haben, wenn du keinerlei CGI- und Perl-Krams laufen lassen möchtest.

            dedlfix.

          2. Tja, die Hypothese stimmte, aber was nun? Es wird ja nicht immer möglich sein, .pl aus der httpd.conf zu löschen.

            Das ist nicht mal ein Bug, sondern ein defektes Feature. In der Apache-Doku steht:

            The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

            Welcher Indianer hat da denn das falsche Kraut geraucht, sowas ist doch nun blühender Unfug.

            Rolf

            1. Hallo Rolf,

              Lesen bildet - hier steht wie man es löst und warum Winnetous Erben meinen, dass ihre Idee kein Rinderverdauungsprodukt ist...

              Rolf

              1. Hello,

                Lesen bildet - hier steht wie man es löst und warum Winnetous Erben meinen, dass ihre Idee kein Rinderverdauungsprodukt ist...

                erstmal ist das die falsche Apache-Version und dann handelt es sich hier um keine "final extension".

                Dein Suchtreffer gehört zwar in den Ergebniskanon auf die notwendige Suche, ist hier aber nicht die Lösung!

                Liebe Grüße
                Tom S.

                --
                Es gibt nichts Gutes, außer man tut es
                Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                1. Yes well - aber bei der 2.2 steht es auch so.

                  Dass der AddHandler im mod_mime eben NICHT nur die Final Extension behandelt, sondern alle, steht genau an der verlinkten Stelle. Um nur CGI-SCripte nur nach Final Extension zuzuordnen, muss man mit FilesMatch und SetHandler arbeiten.

                  Wenn das Problem im Klick auf den Link liegt, dann ist das mMn genau die Lösung.

                  Rolf

                  1. Tach!

                    Dass der AddHandler im mod_mime eben NICHT nur die Final Extension behandelt, sondern alle, steht genau an der verlinkten Stelle.

                    Gut das du das sagts, ich hab nach dem ersten extension zu lesen aufgehört, weil mir nicht in den Sinn kann, dass eine solche auch mittendrin ausgewertet wird.

                    Dann muss ich meine Aussagen etwas relativieren. Die Streichung der Direktive war doch schon ein Hauptteil der Lösung. Ich hatte erst vermutet, dass da noch eine Container-Direktive und/oder ein Umschreiben (Alias/Rewrite) mit im Spiel ist. Nun scheint es wohl eher so zu sein, dass das nur diese eine Direktive ist, die im Xampp gesetzt ist, damit der auch die Perl-Dateien ausführt (das zweite p in seinem Namen). Wenn dann da noch was auf die Füße fallen kann, sind das eher andere/weitere Direktiven, die vorwiegend für Zwecke des Xampp eingerichtet wurden. Der Xampp ist eben hauptsächlich eine Entwicklungsumgebung. Es ist sicher einfacher, eine Produktivmaschine von der Apache-Default-Konfiguration ausgehend mit exakt dem Benötigten aufzubauen, als dem Xampp seine Zusätze abzugewöhnen.

                    dedlfix.

            2. Hello,

              Nee> Tja, die Hypothese stimmte, aber was nun? Es wird ja nicht immer möglich sein, .pl aus der httpd.conf zu löschen.

              Ist das ein Fehler in Apache oder PHP? Dass er beim Versuch, eine Datei "xyz.pl" auszuführen, das mit PERL tun will, verstehe ich. Dass das gleiche bei "xyz.pl.pptx" will, verstehen ich nicht. Und dass er im diskutierten Kontext überhaupt meint, Dateien ausführen zu müssen, verstehe ich am allerwenigsten.

              Nee, das ist eine spätere Stufe der Ursache. Da liegt eindeutig eine mehrfache innerere Umleitung (Umdeutung) zu Grunde. Es muss vorher noch einen Alias(Match) oder ein Rewrite geben, die vorher schon greifen.

              David hat jetzt zwar die Kette der Umleitungen unterbrochen, aber mMn nicht die eigentliche Ursache gefunden.

              Liebe Grüße
              Tom S.

              --
              Es gibt nichts Gutes, außer man tut es
              Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
              1. Und was denkst Du, in welcher PHP-Zeile das passieren sollte? Es gibt drei Kandidaten:

                • openDir - Verzeichnis zum Auslesen öffnen
                • readDir - Eintrag im Verzeichnis lesen
                • echo - Text auf den Response-Stream schreiben

                und bei jedem davon schüttelt es mich, wenn ein Webserver meint, dabei etwas umleiten oder ausführen zu müssen. Ich hole mir den Namen einer Datei, und sie läuft los? Was ist, wenn ich einen Ordner mit Utility-Scripten aufliste, der Schätzchen enthält wie "scratch_hdd" oder ähnliches?

                Der Echo ist noch der wahrscheinlichste Kandidat, aber das Script generiert Anchor-Tags und gibt sie aus, das sollte für den Webserver einfach nur Text sein und nichts, was zu interpretieren ist.

                Rolf

                1. Hallo Rolf,

                  ich kann mir nicht vorstellen, dass dein Listing den Fehler wirft, sondern der Klick auf einen der Links. Und da ist dann kein PHP involviert, sondern nur der Apache.

                  Viele Grüße
                  Robert

                  1. Hello,

                    ich kann mir nicht vorstellen, dass dein Listing den Fehler wirft, sondern der Klick auf einen der Links. Und da ist dann kein PHP involviert, sondern nur der Apache.

                    So sehe ich das aus meinem Erfahrungskontext heraus betrachtet auch.

                    Liebe Grüße
                    Tom S.

                    --
                    Es gibt nichts Gutes, außer man tut es
                    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                2. Hello,

                  Und was denkst Du, in welcher PHP-Zeile das passieren sollte? Es gibt drei Kandidaten:

                  • openDir - Verzeichnis zum Auslesen öffnen
                  • readDir - Eintrag im Verzeichnis lesen
                  • echo - Text auf den Response-Stream schreiben

                  in keiner.

                  Der Fehler kommt erst beim "Aufruf" des generierten Links.
                  So interpretiere ich das Geschriebene aus meinem eigenen Erfahrungs-Kontext heraus, auch wenn der OP das hier nicht wirklich deutlich schreibt.

                  Liebe Grüße
                  Tom S.

                  --
                  Es gibt nichts Gutes, außer man tut es
                  Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                  1. (Robert) dass dein Listing den Fehler wirft,

                    Das ist nicht mein Kreuz. Ich hatte Freispruch!

                    (TS) Der Fehler kommt erst beim "Aufruf" des generierten Links

                    Autsch. Habe ich es nur überlesen, oder hat David es nirgends geschrieben? Ich bin davon ausgegangen, dass der Fehler bei der Script-Ausführung kommt. In dem Fall passt alles zusammen (siehe meine Links zur Apache-Doku).

                    Rolf

                    1. Hello,

                      (Robert) dass dein Listing den Fehler wirft,

                      Das ist nicht mein Kreuz. Ich hatte Freispruch!

                      (TS) Der Fehler kommt erst beim "Aufruf" des generierten Links

                      Autsch. Habe ich es nur überlesen, oder hat David es nirgends geschrieben? Ich bin davon ausgegangen, dass der Fehler bei der Script-Ausführung kommt. In dem Fall passt alles zusammen (siehe meine Links zur Apache-Doku).

                      Das ist halt so. Man liest das, was man lesen will oder kann oder manchmal auch schon muss.

                      Die eigentliche Antwort kann ganz woanders liegen. Geht mir hier oft so, dass ich schon die Lösung im Kopf hatte und auch dachte, sie mitgeteilt zu haben, aber niemand hat sie verstanden. Irgendwann später kam dann jemand von einer ganz anderen Seite und schlussendlich war es "meine Lösung". Aber die wollte keiner mehr sehen :-)

                      Mir fehlt eben das "verwissenschaftlichende" Verfassen von Texten... :-O

                      Aber darum finde ich es immer ganz besonders wichtig, dass OPs am Ende eines erfolgreichen Threads nochmal eine Zusammenfassung geben mit den wichtigsten Fragen, den Irrungen und Lösungsschritten. Das tun auch einige. Ich finde, dass das jeweils 100 Punkte wert sein müsste. :-)

                      Es sollen immer Alle etwas vom Thread haben können!

                      Liebe Grüße
                      Tom S.

                      --
                      Es gibt nichts Gutes, außer man tut es
                      Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        2. Tach!

          Aber suche doch bitte mal selber danach und dann identifiziere das AliasMatch für ".pl" oder ähnlich.

          Warum .pl? Die Dateiendung in der Fehlermeldung ist .pptx. Kann aber natürlich sein, dass ein Muster auf innenliegende Dateinamensbestandteile reagiert.

          Jedenfalls vermute ich auch das Problem bei der Konfiguration des Webservers. Mit PHP und dem gezeigten Code hat das nichts zu tun.

          dedlfix.

          1. Also erstmal reicht mir das so 😉

            Andere Frage: Wenn ich die **Intranet **Seite neu aufbauen möchte inkl Server etc. Was wäre für euch die erste Wahl? Xampp? IIS etwas anderes?

            Grüße

            David

            1. Tach!

              Also erstmal reicht mir das so 😉

              Ich würde mich damit noch nicht zufrieden geben, denn ich vermute, dass die eigentliche Ursache auch noch zu anderen Gelegenheiten zuschlagen könnte.

              Andere Frage: Wenn ich die **Intranet **Seite neu aufbauen möchte inkl Server etc. Was wäre für euch die erste Wahl?

              Das lässt sich allein aus "Intranet" nicht beantworten. Wenn du keine Notwendigkeit für einen Windows-Server hast, dann nimm ein Linux. Eine unter anderen Notwendigkeiten wäre beispielsweise, wenn die Integration in eine bestehende Windows-Domäne eine Rolle spielt. Oder wenn ASP.NET-Anwendungen laufen sollen (obwohl das bedingt auch unter Linux läuft).

              Prinzipiell kann man den Xampp nehmen, der ist nicht grundsätzlich unsicherer als die separate Installation seiner Bestandteile. Es ist vielmehr eine Frage der Konfiguration. Er ist eben nur darauf zugeschnitten, als lokale Entwicklungsumgebung mit weniger laschen Zügeln als im Produktivumfeld zu laufen.

              Unter Linux bietet sich jedoch eher an, die Pakete der Distributionen zu verwenden. Gegebenenfalls zuzüglich weiterer Paketquellen, um aktuellere (PHP-)Versionen zu bekommen. Viele Distributionen sind da von Haus aus eher konservativ.

              dedlfix.

            2. Hello,

              Also erstmal reicht mir das so 😉

              Sollte es aber nicht, weil aus meiner Erfahrung heraus dann später wieder andere unerklärbare™️ Fehler auftauchen werden. Die graben sich dann immer tiefer ins System und werden nur noch schwer identifizierbar!

              Andere Frage: Wenn ich die **Intranet **Seite neu aufbauen möchte inkl Server etc. Was wäre für euch die erste Wahl? Xampp? IIS etwas anderes?

              Nimm einen (älteren) Rechner mit 64Bit-Hardware und versuche, dir darauf ein aktuelles Linux nebst PHP7 und akteuellem MySQL usw. zu installieren. Steht mir leider auch noch bevor. Vielleicht machen wir eine Session draus? :-)

              Die Einbindung in dein LAN sollte dann der weniger schwierige Teil sein.

              Liebe Grüße
              Tom S.

              --
              Es gibt nichts Gutes, außer man tut es
              Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
              1. ich versuch mich mal an opensuse ;-) VMWare sei Dank geht das ja ganz fix 😀

  6. Vermutlich versucht der Server, solche Dateien auszuführen was also entsprechend konfiguriert und damit selbstverständlich auch abstellbar ist. MfG

    1. Vermutlich versucht der Server, solche Dateien auszuführen was also entsprechend konfiguriert und damit selbstverständlich auch abstellbar ist.

      Bestätigung meiner Vermutung