412 — Не выполнено предварительное условие для файлов, поставляемых с X-SendFile

Я получил странное поведение с большими видеофайлами, которые доставляются пользователю с помощью X-SendFile. Сервер отвечает 412 — Сбой предварительного условия.

Если я отключаю X-SendFile, все в порядке, так что это должно быть связано с этим.

Некоторый код:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime =  finfo_file($finfo, $file_path);

header("Content-type: ". $mime);
finfo_close($finfo);
header('Content-length: '.filesize($file_path));
header('Content-Disposition: inline; filename="'.basename($file_path).'"');
header('X-Sendfile: ' . $file_path );

Заголовки:

Request  URL:[redacted]/8c1ab69235fef2009731481d728a3c37.mp4
Request Method:GET
Status Code:412 Precondition Failed
Remote Address:192.168.100.100:80

Запрос:

Accept:*/*
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:en-US,en;q=0.8,ro;q=0.6,de;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:PHPSESSID=rlva81b8gl98flv3r37dd0jtu4
Host:datasolutions.eleap.loc
If-Match:"57e7e64-545404121a47c"Range:bytes=92078080-
Referer:[redacted]/8c1ab69235fef2009731481d728a3c37.mp4
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

Отклик:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:close
Content-Disposition:inline; filename="8c1ab69235fef2009731481d728a3c37.mp4"Content-length:0
Content-Type:video/mp4
Date:Wed, 04 Jan 2017 11:08:23 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.4.20 (Ubuntu)
X-Sendfile:[redacted]/8c1ab69235fef2009731481d728a3c37.mp4

Я не мог найти подсказки о том, что является причиной этого, может быть, один из вас, ребята, имеет представление. Спасибо.

ОБНОВЛЕНИЕ: это происходит только в Chrome.

3

Решение

У меня похожая проблема (не использующая X-Send) при загрузке mp4. Я обнаружил, что при переходе с Chrome на предыдущую версию (54) проблема исчезает. Новая версия 55, вышедшая несколько недель назад, похоже, представила эту проблему.

4

Другие решения

Я только что решил «412 Precondition Failed» на группе веб-серверов, используя mod_xsendfile 0.12 & Настройка Apache / mod_perl для доставки аудиофайлов в формате mp3.

Apache устанавливал слабый ETag в исходящем заголовке. Версия Chrome> = 55 использовала ETag для проверки свежести файла через заголовок HTTP_IF_MATCH, а xsendfile отвечал 412.

Мое исправление состояло в том, чтобы отключить ETag для определенного каталога.

<Directory />
Header unset Etag
FileETag none
</Directory>

Кроме того, вы можете редактировать параметры, используемые для вычисления ETag (например, удалить параметр INode для работы на кластере серверов).

Краткое объяснение деталей можно найти здесь:
http://joshua.schachter.org/2006/11/apache-etags

Apache Docs: http://httpd.apache.org/docs/2.2/mod/core.html#fileetag

Теги сущности: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag

0

По вопросам рекламы [email protected]