Проверка работоспособности заголовка X-Sendfile

Я ищу способ подтвердить, что X-Sendfile правильно обрабатывает запросы, передаваемые обратно на веб-сервер скриптом (PHP). Изображения передаются правильно, но я думал, что увижу заголовок в запросах curl.

$ 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"

Конфигурация

Cherokee 1.2.100 с PHP-FPM 5.3.8 в FastCGI:
cherokee.conf: vserver!20!rule!500!handler!xsendfile = 1
(Установлено vServer > Behavior > Extensions php > Handler: Allow X-Sendfile [check Enabled])

Wordpress Network / WPMU 3.3.1:
define('WPMU_SENDFILE',true); устанавливается в wp-config.php непосредственно перед включением wp-settings.php. Это вызовет выполнение следующего кода в WP's wp-includes/ms-files.php:50, обслуживающего файлы для конкретного блога:

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

Я подтвердил, что вышеприведенный фрагмент выполняется, добавив дополнительный заголовок disposition прямо перед вызовом exit();. Этот Content-Disposition присутствует в результатах curl выше, а не изначально в коде ms-files.php. Код, который был добавлен:
header('Content-Disposition: inline; filename="'.basename($file).''');


Исследование

Я:

  • Перезагрузил демоны php-fpm / cherokee после внесения изменений в конфигурацию.
  • Попробовал несколько трюков в комментариях на php.net/readfile и заменил простой заголовок в ms-files.php на более полный код из примеров.
    • 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/*
  • Подтвердил [поддержку cherokee][5] и протестировал [со сжатием и без][6], хотя я не думаю, что это применимо, поскольку мои изображения подаются правильно. Я также обнаружил подозрительно похожую проблему из сообщения lighttpd.
    • *cherokee-project.com/doc/other_goodies.html*
    • code.google.com/p/cherokee/issues/detail?id=1228
    • webdevrefinery.com/forums/topic/4761-x-sendfile/
  • Нашел здесь на SO сообщение, которое может указывать на то, что заголовок удаляется.
    • stackoverflow.com/questions/7296642/django-understanding-x-sendfile
  • Проверил, что вышеуказанные заголовки совпадают при использовании curl, wget, Firefox, Chrome и web-sniffer.net.
  • Обнаружил, что пока не могу размещать более 2 ссылок из-за недостатка репутации.

Вопросы

  • Будет ли X-Sendfile присутствовать в заголовках, когда он работает правильно, или он удаляется?
  • Можно ли использовать журналы доступа, чтобы определить, работает ли X-Sendfile?

Я ищу здесь общие советы или информацию по устранению неполадок, не обязательно специфические для PHP / Cherokee.

Обновление

Я нашел подходящий способ подтвердить X-Sendfile или X-Accel-Redirect в тестовом окружении или в песочнице: Отключить X-Sendfile и проверить заголовки.

С отключенным Allow X-Sendfile в Cherokee:

$ 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

Изображение не загружается в браузерах, но вы можете видеть, что заголовок присутствует. После повторного включения Allow X-Sendfile изображение загружается, и вы можете быть уверены, что X-Sendfile работает.

8
задан dalethedeveloper 6 January 2012 в 16:03
поделиться