PHP: последний измененный заголовок для фиксированной ссылки на ресурс, где ресурс меняется время от времени? - PullRequest
0 голосов
/ 05 марта 2019

В настоящее время я нахожусь в процессе написания небольшого плагина WordPress для загрузки ресурсов с запущенными обновлениями.Это означает, что я вызываю фиксированный URL-адрес конечной точки, например:

https://www.example.com/downloads/app/latest

Если этот URL-адрес вызывается, сервер доставляет самую последнюю версию запрошенного ресурса (например, исполняемое приложение).Название ресурса может отличаться, но оно может совпадать с более старой версией.Поэтому я хочу поставить рабочий последний измененный заголовок.

По сути, я получил заголовки для установки из этого вопроса: Принудительная загрузка файла с помощью php с использованием header ()

$quoted = sprintf('"%s"', addcslashes(basename($file), '"\\'));
$size   = filesize($file);

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $quoted); 
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Pragma: public');
header('Content-Length: ' . $size);

Теперь мне интересно как правильно установить заголовки так, чтобы браузер знал, изменился ли ресурс .Предполагая, что у меня есть дата последнего изменения запрошенного ресурса, я предполагаю:

header('Cache-Control: must-revalidate');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s T', $last_modified_time));

Если я понятия не имею, что такое дата последнего изменения, я бы поставил:

header('Cache-Control: no-cache');
header('Expires: 0');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s T'));

Это правильно (особенно заголовки) или я что-то упускаю?Не уверен из-за большого количества настроек для управления кэшем, даты модификации, срока действия и, возможно, других.

1 Ответ

0 голосов
/ 06 марта 2019

После некоторых исследований я нашел заголовок ETag, который решает мою проблему. Установка заголовка ETag работает, как описано здесь: Как использовать etags в файле PHP?

Также найдена некоторая информация о том, как объединить это с заголовком Expires: ETag vs Header Expires - заголовок ETag делает по крайней мере один запрос для сравнения контрольной суммы файла, в то время как заголовок expires делает по крайней мере один запрос на всех.

Последняя часть головоломки была: HTTP: Заголовок ETag делает заголовок Cache-Control устаревшим? Как убедиться, что Cache-Control не вреден?

Поэтому теперь у меня есть идеальный ответ (по крайней мере, я так думаю):

$quoted = sprintf('"%s"', addcslashes(basename($file), '"\\'));
$size   = filesize($file);
$etag   = hash_file('md5', $file); 

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $quoted); 
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Pragma: public');
header('Content-Length: ' . $size);
header('Cache-Control: no-cache');
header('Expires: 0');
header('ETag: ' . $etag);
...