Проверьте, работает ли заголовок 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 > Поведение> Расширения php > Обработчик: Разрешить X-Sendfile [проверка включена])
Wordpress Network / WPMU 3.3.1: define('WPMU_SENDFILE',true);
установлен в wp-config.php
следующее незадолго до wp-settings.php
Включено. Это приведет к запуску следующего кода в wp-include / ms-files.php: WP подает файлы для конкретного блога:
header( 'X-Sendfile: ' . $file );
exit;
Я подтвердил, что приведенный выше фрагмент кода выполняется путем добавления дополнительного заголовка для размещения прямо перед 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 / блог /2009/03/06/ отправка-файлы-лучше-апаш-mod_xsendfile-и-PHP /*
- Подтверждено [поддержка чероки][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, которая может указывать на удаление заголовка
- stackru.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 и проверьте заголовки.
С разрешенным 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 работает.
3 ответа
Вы можете проверить использование памяти при отправке больших файлов с xsendfile и без него.
Они удаляются просто потому, что их наличие предотвратит одну из причин его использования, а именно то, что файл будет подан без того, чтобы получатель не знал местоположение обслуживаемого файла.
По словам источника на github, заголовки X-Sendfile будут удалены.
Если я правильно проверяю файл, он регистрирует успех, только если он был скомпилирован в режиме отладки.