2010-10-22 6 views
9

Ich verwende mod_xsendfile (v0.12), um statische Dateien zu liefern, wo Django den Zugriff auf die Dateien basierend auf Benutzern und Berechtigungen steuert.XSendFile wird die Dateien in Apache 2.2 nicht liefern

In meiner conf-Datei, die ich habe:

XSendFile On 
XSendFilePath e:/documents/ 

<Directory e:/Documents> 
    Order allow,deny 
    Allow from all 
</Directory> 

In meinem django Code, habe ich die Header wie folgt:

assert(isinstance(filename, FieldFile)) 

xsendfile = filename.name 
if(platform.system() == 'Windows'): 
    xsendfile = xsendfile.replace('\\', '/') 

response = HttpResponse() 
response['X-Sendfile'] = xsendfile 
mimetype = mimetypes.guess_type(xsendfile)[0] 
response['Content-Type'] = mimetype 
response['Content-Length'] = filename.size 

Und in meinem Log-Datei erhalte ich:

[Fri Oct 22 08:54:22 2010] [error] [client 192.168.20.34] (20023)The given path 
was above the root path: xsendfile: unable to find file: 
e:/Documents/3/2010-10-20/TestDocument.pdf 

In dieser Version von mod_xsendfile,

XSendFileAllowAbove On 

erzeugt den Fehler:

Invalid command 'XSendFileAllowAbove', perhaps misspelled or defined by a module 
not included in the server configuration 

ich davon aus, dass war, weil sie die XSendFilePath weißen Liste hinzugefügt haben. Hat jemand anderes das zur Arbeit gebracht?

Antwort

13

Legen Sie keine Inhaltslänge selbst fest. Dies verwirrt nur Handler wie mod_wsgi in diesem Fall. mod_xsendfile wird selbst die richtige Content-Length einstellen.

Unter Windows müssen Sie nicht nur den Laufwerksbuchstaben angeben, der Laufwerksbuchstabe muss tatsächlich in Großbuchstaben (IIRC) sein!

ich eine Arbeitstestkonfiguration wie so haben:

<Directory "E:/"> 
    XSendFile on 
    XSendFilePath E:/localhosts 
</Directory> 

Einer meiner Arbeitstestskripte in E: /Apache2.2/htdocs/ sieht wie folgt aus:

<?php 
    header('X-SendFile: E:/localhosts/archive.tar.bz2'); 
    header('Content-type: application/octet-stream'); 
    header('Content-disposition: attachment; filename="blob"'); 
?> 

XSendFileAllowAbove entfernt wurde eine Weile zurück zugunsten XSendFilePath

+1

Eine andere Sache, die ich in all dem entdeckt habe, ist, dass der gesamte Pfad Groß-und Kleinschreibung unterscheidet, auch wenn Sie auf Windows sind.Wäre ich auf Linux gewesen, wäre mir das sofort eingefallen, aber unter Windows habe ich diese Probleme verworfen. Der DRIVE LETTER MUSS GROSS sein! – boatcoder

2

Ich hatte eine ganze Menge Probleme die meisten Male musste ich XSendfile Pfad konfigurieren.

Hier teste ich verschiedene Szenarien unter Windows, um zu sehen, was falsch war (Sprung zum Ende dieses Beitrags der Schlussfolgerung ad Empfehlungen zu sehen):

<?php 

/* X-SENDFILE 
* This can be a b*tch to configure. So I'm writing various scenarios here so that I can rely on them in the future. 
* Example use: after re-installing XAMPP, after changing config file, in a new script, after some time without using it... 
* Tested on Windows 7 + XAMPP (Apache/2.4.3, PHP/5.4.7) + mod_xsendfile 1.0-P1 for Apache 2.4.x Win32 
*/ 

/** Environment Debug **/ 
//echo dirname(__FILE__); die(); 
//echo $_SERVER['DOCUMENT_ROOT']; die(); 

/** The damn fucking path, with comments **/ 

// Local file in execution directory. 
// Tested with: *no* XSendFilePath inside of the Apache config 
// Result: works fine. 
//header("X-Sendfile: " . 'localfile.zip'); 

// Local file in execution directory + relative path 
// Tested with: *no* XSendFilePath inside of the Apache config 
// Result: works fine. 
//header("X-Sendfile: " . '../xsendfile/localfile.zip'); 

// Local file in execution directory + absolute pathS 
// Tested with: *no* XSendFilePath inside of the Apache config 
// Result: works fine and a lot of flexibility on the slash and letter drive format combinations *BUT* case-sensitive 
//header("X-Sendfile: " . 'D:\Dropbox\XAMPP\web\tests\Languages\Apache\xsendfile\localfile.zip'); // works fine 
//header("X-Sendfile: " . '\Dropbox\XAMPP\web\tests\Languages\Apache\xsendfile\localfile.zip'); // works fine 
//header("X-Sendfile: " . 'D:/Dropbox/XAMPP/web/tests/Languages/Apache/xsendfile/localfile.zip'); // works fine 
//header("X-Sendfile: " . '/Dropbox/XAMPP/web/tests/Languages/Apache/xsendfile/localfile.zip'); // works fine 
//header("X-Sendfile: " . '/dropbox/XAMPP/web/tests/Languages/Apache/xsendfile/localfile.zip'); // FAILS (case-sensitive) 

// File in the XSendFilePath directory + Absolute path 
// Tested with: XSendFilePath D:\Dropbox\XAMPP\web -- Mind the backward slashes 
// Result: FAILS! error.log => [Wed Feb 20 19:08:02.617971 2013] [:error] [pid 15096:tid 1768] (20023)The given path was above the root path: [client ::1:56658] xsendfile: unable to find file: D:\\Dropbox\\XAMPP\\web\\xsfile.zip 
//header("X-Sendfile: " . 'D:\Dropbox\XAMPP\web\xsfile.zip'); 

// File in the XSendFilePath directory + Absolute path 
// Tested with: XSendFilePath D:/Dropbox/XAMPP/web <== mind the forward slashes this time 
// Result: WORKS! Conclusion: XSendFilePath needs use forward slashes on Windows AND we don't need any trailing slash in it. 
header("X-Sendfile: " . 'D:\Dropbox\XAMPP\web\xsfile.zip'); 

/** We might wanna test also: 
* - How does backward slashes in both XSendfilePath and the header combine? 
* - The use of subdirectories. 
*/

/** The rest of the headers (until otherwise stated, nothing special) **/ 
header("Content-Type: application/zip"); 
header("Content-Disposition: attachment; filename=\"" . 'blah.zip' . "\""); 
header("Content-Transfer-Encoding: binary"); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 

/** Tell the script to stop (so the file download may start) **/ 
die(); 


?> 

Also, im Grunde für X-Sendfile unter Windows Stellen Sie Folgendes sicher:

  • Sie verwenden Schrägstriche in Ihrer Apache-Konfiguration für XSendfilepath (obligatorisch);
  • Respektieren Sie die Fall in Ihren Pfaden, obwohl wir auf Windows (obligatorisch) sind;
  • Verwenden absolute Pfade überall (empfohlen)
  • Keine Hinter für XSendfilePath Schrägstriche (empfohlen)

Hoffe, es hilft jemand! Fabien