mod_rewrite, unterordner und mehr

ja, dann wird bei der ersten umleitung gestoppt auf die datei selbst umgeleitet -> aber wenn das dann per htacces überprüft wird, greift wieder die zweiteumleitung.

lass dir in der php-datei mal einfach nur die get-Variable ausgeben. du wirst sehen, er wirft dich immer wiedre zurück an den anfang!

ich habs eben selbst mal ausprobiert, ist wirklich knifflig.

Halte dich doch bitte an die Netiquette und beachte Groß- und Kleinschreibung, danke.
 
also das mit dem Download je nach Berechtigung wuerde in etwa so realisieren:
PHP:
//zunächst aus einer Datenbank abfragen ob der User die Berechtigung hat, wenn ja:
header('Content-Type: '.$ctype);    // hierbei ist $ctype der Typ der Datei, wenn unbekannt dann bspw. $ctype="application/force-download"
header('Content-Length: '.@filesize($pfad) ); //in $pfad steht der reale Pfad der Datei, also in deinem Bespiel "/var/www/ich/ordner/datei.txt"
header('Content-Disposition: attachment; filename='.$filename); //$filename ist der Dateiname den die gedownloadete-Datei haben soll, ggf halt einfach "datei.txt"
header("Content-Transfer-Encoding: binary"); 
@readfile($pfad);

mit dem Script oben gibt sich deine PHP-Datei im endeffekt als die zudownloadende Datei aus und schickt sie an den Client.

Lg
LOK
 
Also ich hab vorhin mal mit dem Logging gespielt und da kommt halt auch raus, dass ich immer wieder in die gleiche Situation laufe. Ist ja auch halbwegs logisch.
NUR:
Warum ist nicht irgendwann mal Schluss mit dem rewriten? Ich meine, irgendwann (eigentlich schon nach der ersten Regelanwendung) muss es doch mal heißen "So, Schluss jetzt, genug umgeleitet, jetzt zeige ich mal die blöde Datei und lass nicht immer wieder die Regeln drüber laufen"
Das ist alles nur wegen meinem (.*) oder? Das fängt ja alle Dateien ab. Bei anderen rewrite-Scripts kommt sowas halt nicht vor und irgendwann ist dann Ende oder?

Naja, danke an alle. LOK, ich denke ich nehme dann deinen Code so und muss mich mit dem Content-Type rumschlagen.

EDIT: Verdammt, es muss doch son blödes Flag geben, das sagt, dass Ende ist. :( *kopf-tisch*
 
Es ist schon möglich:
Code:
RewriteRule (.+)_showme$   /$1     [L]

RewriteCond %{REQUEST_URI} !^/filelisting/showfile\.php$
RewriteCond %{THE_REQUEST} !.+_showme\s
RewriteRule (.+)           /filelisting/showfile.php?file=$1 [L]
Allerdings ist dadurch der Umweg über die „showfile.php“-Datei eigentlich unnötig, da er auch einfach umgangen werden kann, indem gleich das „_showme“ angehängt wird.
 
naja... mit den Types rumschlagen musst du dich nicht unbedingt...
das hier sollte schon relativ gut weiterhelfen:
PHP:
$file_extension = strtolower( substr(strrchr($filename, "."), 1) );  // dabei ist $filename natürlich der Dateiname... wuerde aber auch mit dem kompletten Pfad inkl. Dateinamen gehen
switch(strtolower( $file_extension ))
{
  case "pdf": $ctype="application/pdf"; break;
  case "exe": $ctype="application/octet-stream"; break;
  case "zip": $ctype="application/zip"; break;
  case "doc": $ctype="application/msword"; break;
  case "xls": $ctype="application/vnd.ms-excel"; break;
  case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  default: $ctype="application/force-download";
}

da sind die gängisten Types schon drin, kannst du natürlich beliebig erweitern... wobei mittels force-download auch alle anderen downloadbar sein sollten
 
Den Inhaltstyp „application/force-download“ gibt es nicht, statt dessen sollte der Typ „application/octet-stream“ verwendet werden.
 
In der Tat muss ich recht geben, dass es den Inhaltstyp „application/force-download“ nicht gibt.
Jedoch wird dieser Typ trotzdem von einigen Browsern akzeptiert... hierbei ist natürlich das "einige" ein Problem...

lieber also wie vorgeschlagen „application/octet-stream“

Danke für den Hinweis @Gumbo ;-)

Lg
LOK
 
Super! Vielen Dank euch!

Sowohl meine Lösung mit
RewriteOptions maxredirect=1
als auch die Lösung von Gumbo mit dem bedingten Rewrite
RewriteCond %{REQUEST_URI} !^/filelisting/showfile\.php$
RewriteCond %{THE_REQUEST} !.+_showme\s
RewriteRule (.+) /filelisting/showfile.php?file=$1 [L]

funktionieren zwar, allerdings steht dann nachher, wenn die Datei angezeigt wird, oben in der Adresszeile noch der Dateiname mit _showme. Dadurch ist mein "Schlüsselwort" ja bekannt und man kann mit Hilfe des Schlüsselwortes auf alle Dateien direkt zugreifen. Ist natürlich blöde so. Hatte ich nicht bedacht.

Der Vollständigkeit halber, hier meine momentane Lösung (der wichtige Ausschnitt): [showfile.php]
PHP:
if ($rights&1) //if user has right to read file
   {
   $fileextension = strtolower( substr(strrchr($file, "."), 1) );

   //if the file has an extension, which should be included (i.e. php, htm, ...)
   if (in_array($fileextension, $_SYSTEM["extensions_include"]))
      {
      include($file);
      }
   else
      {
      switch ($fileextension)
             {
             case "pdf":  $ctype="application/pdf"; break;
             case "zip":  $ctype="application/zip"; break;
             case "rar":  $ctype="application/x-rar-compressed"; break;
             case "doc":  $ctype="application/msword"; break;
             case "xls":  $ctype="application/vnd.ms-excel"; break;
             case "ppt":  $ctype="application/vnd.ms-powerpoint"; break;
             case "txt":  $ctype="text/plain"; break;
             case "gif":  $ctype="image/gif"; break;
             case "bmp":  $ctype="image/bmp"; break;
             case "png":  $ctype="image/png"; break;
             case "jpeg": $ctype="image/jpeg"; break;
             case "jpg":  $ctype="image/jpeg"; break;
             case "tif":  $ctype="image/tiff"; break;
             case "tiff": $ctype="image/tiff"; break;
             default:     $ctype="application/octet-stream"; break;
             }
      header('Content-Type: '.$ctype);
      header('Content-Length: '.@filesize($file) );
      header("Content-Transfer-Encoding: binary");
      @readfile($file);
      }

   }
else //user has no right to read file. show login form.
   {
   //...
   }

[.htaccess]
Code:
RewriteEngine on
RewriteRule (.+) /filelisting/showfile.php?file=$1 [L]
 
Zurück