Есть сервер, на него установлен apache и nginx в качестве фронт-енда. Т.е. статику отдаёт сам, остальное передаёт апачу.
Недавно был переезд с одного сервера на другой, конфиги я просто скопировал и всё вроде как работало, но пользователи стали даловаться, что файлы не скачиваются.
И действительно, открыв Google Chrome и попытавшись скачать файл я лишь увидел в ответ заголовки
Request URL:http://....mp4
Request Method:GET
Status Code:206 Partial Content
Response Headers
Cache-Control:max-age=86400
Connection:keep-alive
Content-Length:1
Content-Range:bytes 4021-4021/87723281
Content-Type:application/octet-stream
Date:Tue, 01 Nov 2011 13:14:22 GMT
Expires:Wed, 02 Nov 2011 13:14:22 GMT
Last-Modified:Sun, 30 Oct 2011 22:33:24 GMT
Server:nginx
И статус "(canceled)" (во вкладке Network в dev-tools).
Файл не скачивается.
Открыл FireFox и файл в нём скачался.
Заголовки такие:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 01 Nov 2011 13:17:34 GMT
Content-Type: application/octet-stream
Content-Length: 87723281
Last-Modified: Sun, 30 Oct 2011 22:33:24 GMT
Connection: keep-alive
Expires: Wed, 02 Nov 2011 13:17:34 GMT
Cache-Control: max-age=86400
Accept-Ranges: bytes
Файл успешно начал скачиваться.
К слову — файл я отдаю через php просто через header('Location: ...');
Можете скинуть URL который в хроме не качается (можно в приват)? И отдавать файлы «через php» с помощью nginx лучше не заголовком Location, а X-Accel-Redirect — тогда пользователи не увидят реальный URL файла и не смогут его скачать в обход вашего скрипта.
Кстати 206 Partial Content возвращается только когда пытаешься скачать файл второй раз, если я чищу кеш и пытаюсь скачать файл в Chrome — у меня ответ сервера 200 Ok, но Хром все равно не качает
Теоретически — это так. Но у хрома видимо есть какие то причины попытаться проиграть файл.
Поидее ему нужно как то отдать дополнительный хиадер: Content-Disposition: attachment тогд он будет его скачивать.
Проверил — такая же проблема как и в Chrome наблюдается в Safari.
В логе браузера при этом появляется запись:
Chrome: Resource interpreted as Other but transferred with MIME type undefined.
Safari: Ресурс интерпретирован как Документ, но перемещен с MIME-типом application/octet-stream.
Как вариант — попробуйте отдавать mp4 файлы с MIMI video/mp4, может что-то из этого выйдет. Еще посмотрите какая версия nginx, может обновление поможет.
Не был прописан mime-type в nginx-конфиге, но так и было задумано, прописал, но это кажется ничего не изменило. Да и «application/octet-stream» который был до этого всегда подходил, он просто отдаётся на скачивание без проигрывания.
nginx/0.7.67 — последний, который есть в репах моего дебиана
А воз и ныне там проблему никак пока не удалось решить
location /files {
if ($request_filename ~* ^.*?/([^/]*?)$)
{
set $filename $1;
add_header Content-Disposition «attachment; filename=$filename»;
}
}
почему то не работает