Testen Sie, ob der X-Sendfile-Header funktioniert

Lesezeit: 3 Minuten

Benutzer-Avatar
dalethedeveloper

Ich suche nach einer Möglichkeit zu bestätigen, ob X-Sendfile Anfragen, die von einem Skript (PHP) an den Webserver zurückgegeben werden, ordnungsgemäß verarbeitet. Bilder werden korrekt bereitgestellt, aber ich dachte, ich würde den Header in Curl-Anfragen sehen.

$ curl -I http://blog2.stageserver.net/wp-includes/ms-files.php?file=/2011/05/amos-lee-feature.jpg
HTTP/1.1 200 OK
Date: Wed, 04 Jan 2012 17:19:45 GMT
Server: Cherokee/1.2.100 (Arch Linux)
ETag: "4dd2e306=9da0"
Last-Modified: Tue, 17 May 2011 21:05:10 GMT
Content-Type: image/jpeg
Content-Length: 40352
X-Powered-By: PHP/5.3.8
Content-Disposition: inline; filename="amos-lee-feature.jpg"

Aufbau

Cherokee 1.2.100 mit PHP-FPM 5.3.8 in FastCGI:
cherokee.conf: vserver!20!rule!500!handler!xsendfile = 1

(Set by vServer > Behavior > Extensions php > Handler: Allow X-Sendfile [check Enabled])

WordPress-Netzwerk / WPMU 3.3.1:
define('WPMU_SENDFILE',true); ist in eingestellt wp-config.php das folgende kurz davor wp-settings.php ist enthalten. Dies löst den folgenden Code aus, der ausgeführt werden soll wp-includes/ms-files.php:50 von WP stellt Dateien für einen bestimmten Blog bereit:

header( 'X-Sendfile: ' . $file );
exit;

Ich habe bestätigt, dass das obige Snippet ausgeführt wird, indem ich einen zusätzlichen Header für die Disposition direkt vor dem hinzugefügt habe exit(); Anruf. Diese Content-Disposition ist bei den curl-Ergebnissen oben und nicht ursprünglich im ms-files.php-Code vorhanden. Der hinzugefügte Code lautet:
header('Content-Disposition: inline; filename="'.basename($file).'"');


Forschung

Ich habe:

  • php-fpm / cherokee-Daemons neu gestartet, nachdem Konfigurationsänderungen vorgenommen wurden.
  • Versuchte mehrere Tricks in den Kommentaren drüben bei php.net/readfile und ersetzte den einfachen Header in ms-files.php mit vollständigerem Code aus Beispielen.
    • php.net/manual/en/function.readfile.php
    • www.jasny.net/articles/how-i-php-x-sendfile/
    • *codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/*
  • Bestätigt [cherokee support][5] und getestet [with and without][6] Komprimierung, obwohl ich nicht glaube, dass dies zutreffen würde, da meine Bilder korrekt bereitgestellt werden. Ich habe auch ein verdächtig ähnliches Problem in einem lighttpd-Beitrag gefunden.
    • *cherokee-project.com/doc/other_goodies.html*
    • code.google.com/p/cherokee/issues/detail?id=1228
    • webdevrefinery.com/forums/topic/4761-x-sendfile/
  • Hier auf SO wurde ein Klappentext gefunden, der darauf hindeuten kann, dass der Header entfernt wird
    • stackoverflow.com/questions/7296642/django-understanding-x-sendfile
  • Getestet, dass die obigen Header von curl, wget, Firefox, Chrome und web-sniffer.net konsistent sind.
  • Habe herausgefunden, dass ich aufgrund mangelnder Reputation noch nicht mehr als 2 Links posten kann.

Fragen

  • Werden X-Sendfile in den Headern vorhanden sein, wenn es richtig funktioniert, oder wird es entfernt?
  • Können die Zugriffsprotokolle verwendet werden, um festzustellen, ob X-Sendfile funktioniert?

Ich suche hier nach allgemeinen Tipps oder Informationen zur Fehlerbehebung, die nicht unbedingt spezifisch für PHP / Cherokee sind.

Aktualisieren

Ich habe einen geeigneten Weg gefunden, X-Sendfile oder X-Accel-Redirect in einer Test- oder Sandbox-Umgebung zu bestätigen: Deaktiviere X-Sendfile und überprüfe die Header.

Wenn Allow X-Sendfile in Cherokee deaktiviert ist:

$ curl -I http://blog2.stageserver.net/wp-includes/ms-files.php?file=/2011/05/amos-lee-feature.jpg
HTTP/1.1 200 OK
Date: Fri, 06 Jan 2012 15:34:49 GMT
Server: Cherokee/1.2.101 (Ubuntu)
X-Powered-By: PHP/5.3.6-13ubuntu3.3
Content-Type: image/jpeg
X-Sendfile: /srv/http/wordpress/wp-content/blogs.dir/2/files/2011/05/amos-lee-feature.jpg
Content-Length: 40352

Das Bild wird in Browsern nicht geladen, aber Sie können sehen, dass der Header vorhanden ist. Nach dem erneuten Aktivieren von X-Sendfile zulassen wird das Bild geladen und Sie können sicher sein, dass X-Sendfile funktioniert.

Laut dem Quelle auf github X-Sendfile-Header werden entfernt.

Wenn ich die Datei korrekt überfliege, wird nur Erfolg protokolliert, wenn sie im Debug-Modus kompiliert wurde.

  • Interessant, dazu habe ich die Quelle nachgeschaut Cherokee und nginx. Es scheint, dass sie alle die Header entfernen oder aus einem leeren Satz neu erstellen.

    – dalethedeveloper

    5. Januar 2012 um 15:10 Uhr


Sie können die Speichernutzung beim Senden großer Dateien mit und ohne xsendfile überprüfen.

  • Guter Vorschlag, aber nichts, womit man auf Servern in einer Live-Umgebung spielen kann. Vielleicht sind einige Sandbox-Tests angebracht.

    – dalethedeveloper

    5. Januar 2012 um 15:18 Uhr

Sie werden entfernt, einfach weil ihre Anwesenheit einen der Gründe für ihre Verwendung verhindert, nämlich dass die Datei zugestellt wird, ohne dass der Empfänger den Speicherort der zugestellten Datei kennt.

1385030cookie-checkTesten Sie, ob der X-Sendfile-Header funktioniert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy