erawan: Problem bei Dateidownload mit mod_rewrite lösen?

Servus miteinander!

Ich bitte euch mir bei folgendem Problem zu helfen:

Ein von mir erstellter geschützter/protokollierter Dateidownload funktioniert soweit ganz gut, bis auf die Tatsache das manche Browser (hauptsächlich der IE auf WinPCs) den vorgeschlagenen Dateinamen verschlucken und statt dessen den Scriptnamen als Dateinamen vorschlägt.

Das Ergebnis meiner Suche war, dass sich das mit Hilfe mod_rewrite lösen lässt. Nur da tauchen dann die nächsten Probleme auf: weder mit mod_rewrite noch mit den (für die RewriteRule) notwendigen regulären Ausdrücken bin ich wirklich vertraut (auch nach längeren Studium der diversen Quellen)...

Ich versuch mal den derzeitigen Ablauf bei einem Download zu beschreiben:

Downloadlink - download.php?id=12

in der Datei "download.php" wird die ID in einer Session Variable gespeichert, dem Benutzer ein Erklärungstext angezeigt und nach ein paar Sekunden die aktuelle Seite noch mal aufgerufen

Beim nochmaligen Aufruf wird geprüft ob die Session Variable gesetzt ist wenn ja werden aus der Datenbank die Dateidaten gelesen und über die üblichen header an den Browser ausgegeben.

Was ich jetzt bräuchte wäre:
1. auf welche URL soll ich weiterleiten um
2. eine entsprechende RewriteRule auszulösen die das Problem mit dem falschen Dateinamen löst

z.B. refresh auf "download/Ich bin eine Datei mit sonder und leerzeichen und äüß.pdf" (lt. php-faq löst das den IE Bug wenn man den gewünschten Dateinamen hinter einem / angibt) und per Rewrite nur download.php aufrufen (weitere Parameter eigentlich nicht notwendig weil ja die bereits in der Session gespeichert sind)?

Hoffe ich hab alles verständlich erklärt und ihr könnt mir hier weiterhelfen!

Lg erawan

  1. Nachtrag:

    Die RewiteRule die ich mir bisher erarbeitet habe und leider nicht funktioniert sieht so aus:

    RewriteRule /admin/download/(.)+ /admin/download.php

    wie im vorigen Beitrag beschrieben wollte ich im Downloadscript einen refresh auf den (nicht vorhandenen) Ordner download machen URL='download/$datei_name' und die RR sollte das abfangen und trotzdem die download.php aufrufen ...

    Lg erawan

    1. Die RewiteRule die ich mir bisher erarbeitet habe und leider nicht funktioniert sieht so aus:

      RewriteRule /admin/download/(.)+ /admin/download.php

      Bei Benutzung in der .htaccess des obersten Verzeichnisses muss das so aussehen:

      RewriteEngine on
      RewriteBase /
      RewriteRule ^admin/download/ admin/download.php

      Die ersten beiden Zeilen hast Du vielleicht nur vergessen zu zitieren.

      Der wesentliche Unterschied ist, dass das Muster ohne Schrägstrich beginnt, da die zu vergleichende URL bei Nutzung in der .htaccess immer relativ zum jeweiligen Verzeichnis angeliefert wird (hier zB: "admin/download/datei", nicht "/admin/download/datei").

      Weiterhin solltest Du darauf achten, das Muster möglichst genau anzupassen. Deine URL beginnt mit admin, daher sollte das Muster auch als erstes Zeichen das Hier-beginnt-der-Text-^ bekommen. admin/download passt auf example.com/admin/download, aber auch auf example.com/ganz/tief/unten/admin/download; ^admin/download passt nur auf die erste URL.

      Drittens wäre es eventuell sinnvoll, diese Regel im dazugehörigen Verzeichnis abzulegen (hier: /admin/) statt im Wurzelverzeichnis, damit sie nicht bei sämtlichen Zugriffen auf den Webserver ausgeführt werden muss. Die .htaccess wäre dann /admin/.htaccess und hätte diesen Inhalt:

      RewriteEngine on
      RewriteBase /admin/
      RewriteRule ^download/ download.php

      Viertens kannst Du Dir den Rewrite-Kram sparen, wenn Du im Verzeichnis /admin/ die Option AcceptPathInfo einschaltest (und einen Apache 2 benutzt). Ein Zugriff auf /admin/download.php/blabla landet dann ohne weitere Umstände bei /admin/download.php zusammen mit der Variablen $_SERVER["PATH_INFO"]="blabla". Ist vielleicht nicht so hübsch (wegen des download.php/ statt download/), aber auch eine Möglichkeit.
      Beschränke die Option mit <files> auf download.php (wie im Beispiel von AcceptPathInfo angegeben). Unter Umständen akkzeptiert Dein PHP-Interpreter derartige URLs auch ohne Setzen von AcceptPathInfo, probiere es aus.

      1. Hallo

        Vielen Dank für die Antwort.

        ja die ersten 2 Zeilen hatte ich nur nicht hingeschrieben waren aber auch bei mir vorhanden.

        Hab die htaccess Datei auch im admin Ordner liegen.

        Leider funktioniert die ganze Sache nicht!? (Der Browser nimmt die Url  ernst und schreibt dann natürlich dass es diese Datei nicht gibt)

        Das mit dem AcceptPathInfo härt sich gar nicht so schlecht an (hab ja schließlich auch einen Apachen in der 2. Generation) - da gibts nur den Hacken das ich nicht genau weiß was ich wo das dann reinschreiben muss? in die httpd.conf?

        Derzeit akzeptiert er die Eingabe von dateien ohne Endung nicht (also z.B. admin/datei wird nicht auf admin/datei.php weitergeleitet

        mfg erawan

        1. Hab die htaccess-Datei auch im admin-Ordner liegen.

          Wenn Du

          RewriteRule /admin/download/(.)+ /admin/download.php

          im admin-Ordner liegen hast, kann es aus dem bereits genannten Grund, dass die Muster relativ zum jeweiligen Verzeichnis angegeben werden müssen, nicht funktionieren. Ein funktionierendes Beispiel für /admin/.htaccess hatte ich schon zitiert.

          Das mit dem AcceptPathInfo härt sich gar nicht so schlecht an (hab ja schließlich auch einen Apachen in der 2. Generation) - da gibts nur den Haken, dass ich nicht genau weiß, was ich wo das dann reinschreiben muss? in die httpd.conf?

          AcceptPathInfo ist genauso wie RewriteRule eine Konfigurationsanweisung, die Du sowohl in einer serverweiten httpd.conf als auch in der verzeichnisspezifischen .htaccess ablegen kannst (beide Dateien sind Konfigurationsdateien, lediglich ihr Wirkungsbereich ist unterschiedlich). Letzteres, also das Ablegen von AcceptPathInfo in der .htaccess des betreffenden Verzeichnisses (/admin/), wäre hier allerdings sinnvoller, schon alleine, weil Du die Option ja nicht auf dem gesamten Webserver einschalten möchtest.

          Derzeit akzeptiert er die Eingabe von dateien ohne Endung nicht (also z.B. admin/datei wird nicht auf admin/datei.php weitergeleitet

          Legst Du da Wert drauf?

          1. Ein funktionierendes Beispiel für /admin/.htaccess hatte ich schon zitiert.

            Danke das hab ich auch so übernommen bevor ichs ausprobiert habe.

            AcceptPathInfo ist genauso wie RewriteRule eine Konfigurationsanweisung, die Du sowohl in einer serverweiten httpd.conf als auch in der verzeichnisspezifischen .htaccess ablegen kannst (beide Dateien sind Konfigurationsdateien, lediglich ihr Wirkungsbereich ist unterschiedlich). Letzteres, also das Ablegen von AcceptPathInfo in der .htaccess des betreffenden Verzeichnisses (/admin/), wäre hier allerdings sinnvoller, schon alleine, weil Du die Option ja nicht auf dem gesamten Webserver einschalten möchtest.

            Aha wieder ein Stück schlauer. Werd das ausprobieren und hoffe das es funktioniert.

            Derzeit akzeptiert er die Eingabe von dateien ohne Endung nicht (also z.B. admin/datei wird nicht auf admin/datei.php weitergeleitet

            Legst Du da Wert drauf?

            nein wenns nicht meinem Problem behilflich ist

            1. Ein funktionierendes Beispiel für /admin/.htaccess hatte ich schon zitiert.

              Danke das hab ich auch so übernommen bevor ichs ausprobiert habe.

              RewriteEngine on
              RewriteBase /admin/
              RewriteRule ^download/ download.php

              zeigt keine Wirkung in /admin/.htaccess?

              Funktioniert denn wenigstens

              RewriteEngine on
              RewriteBase /
              RewriteRule ^admin/download/ download.php

              in /.htaccess?

              1. Funktioniert denn wenigstens

                RewriteEngine on
                RewriteBase /
                RewriteRule ^admin/download/ download.php

                in /.htaccess?

                Folgende Version funktioniert jetzt anscheinend (.htaccess im Ordner admin & refresh auf download/$dateiname in der Datei download.php)

                Options +FollowSymlinks
                RewriteEngine on
                RewriteBase /
                RewriteRule /(.*)$ /admin/download.php?datei=$1

                Ich vermute aber dass es auch Probleme mit dem Editor gegeben hat, mit dem ich die htacces erstellt hab.

                Danke nochmals für die Hilfe!

                Mfg erawan

                1. Kurzer Nachtrag zu den Headern für jene die mal danach suchen:

                  neben (den eigentlich nur benötigten) Headern
                  header('Content-Type: application/octet-stream');
                  header('Content-Disposition: attachment; filename="' . $datei_name . '"');
                  header("Content-Length: $size");

                  Am besten auch folgende 2 Zeilen angeben damits auch im IE problemlos funktioniert:
                  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                  header('Pragma: public');

                  readfile($filename);

  2. Versuch doch mal folgende HTTP-Header zu senden vor dem Download:

      
    $strFileToDownload = "download/blabla.zip"; // relative from the php script  
    header("Content-Disposition: attachment; filename=$strFileToDownload");  
    readfile($strFileToDownload);  
    die();  
    
    

    Gruß MeXXi
    --
    ie:% fl:{ br:^ va:| ls:[ fo:| rl:? n4:( ss:} de:> js:| ch:? sh:) mo:| zu:}

    1. Versuch doch mal folgende HTTP-Header zu senden vor dem Download:

      Hallo Mexxi

      Danke für den Tipp nur das mach ich eh schon so *g* (+ noch a paar andere für Typ & Size)

      Wie gesagt vom Download her funktioniert ja alles bis auf das bei ein paar Browser nicht der übergebene Name übernommen wird und statt dessen der Scriptname verwendet wird.

      Ich hoffe das ich mit dem mod_rewrite/AcceptPathInfo weiterkomme denn sonst sehe ich keine Lösungsansatz mehr ...

      Mfg erawan