Издаването на файл от PHP чрез nginx (Accel-Redirect) възобновява някои тънкости, Личен блог
Как да контролирам изтеглянията на големи файлове чрез проверка на разрешенията или преброяване на броя на изтеглянията? Как да накарам автобиографията да работи при проксиране на Apache? Как възобновяването работи като цяло, защо не работи с nginx в IE 9 и как работи в други браузъри?
1. Искаме да контролираме изтеглянията на големи файлове, като проверяваме разрешенията или броим броя на изтеглянията. Използваме nginx и PHP (или друг език от страна на сървъра).
Това се прави много лесно чрез заглавката Accel-Redirect. nginx получава заявката, предава я на скрипта, скриптът издава Accel-Redirect в заглавията на отговора с връзка към файла, който трябва да бъде върнат на потребителя. Ако файлът не може да бъде издаден (например, няма права), скриптът просто ще даде грешка (например 403).
В този случай няма значение дали вашият PHP работи чрез проксиране от nginx към Apache или * CGI. Да предположим, че искате да качите файлове, които са в директорията/var/files. След това в сървърния раздел в nginx добавете:
В скрипта, който контролира изтеглянето, на мястото, където искаме да дадем файла на потребителя, трябва да има следния код:
Няма нужда да правите изход (ехо), след като върнете заглавката, можете да прекратите скрипта. В този случай файлът /var/files/filename.zip ще бъде изтеглен. Вместо filename.zip може да има всеки дълъг път до директорията, който трябва да съвпада с пътя към файла в/var/files /.
По принцип това е достатъчно, за да прехвърли доставката на файла върху раменете на nginx. Ако трябва да покажете диалоговия прозорец за качване (дори ако файлът е от този тип, който браузърът може да покаже сам), трябва да добавите изхода на заглавката:
Моля, имайте предвид също, че в случай на проксиране на Apache, последният определено ще зададе Content-Type (по подразбиране, обикновено text/html) в случай на PHP скриптове и този тип ще бъде изпратен на потребителя, тъй като nginx ще не го пренаписвайте при изпълнение на Accel-Redirect ... Тези. в този случай този ред трябва да бъде написан. Как ще бъде в случаите с * CGI, не знам - не проверих.
2. В такава схема възобновяването не работи при проксиране на Apache. Поправяне.
HTTP възобновяването работи чрез HTTP заглавката Range. Той показва от кой байт да започне предаването. Можете също така да посочите колко байта да се прехвърлят. Това се изпраща в заявката. Например:
Първата опция иска да даде целия файл, започвайки от 33 байта (включително). Втората опция иска да изпрати от 33 байта до 100. За да може браузърът да разбере, че автобиографията се поддържа, сървърът изпраща заглавка в отговора:
Резюмето не работи поради факта, че Range HTTP заглавката попада в Apache след заявка и последният смята, че се иска да даде част от PHP файла. Но той не иска да направи това и извежда грешка: HTTP/1.1 416 Заявеният диапазон не е удовлетворителен.