@Extramezz

Кэширование редиректа?

У нас на проекте используется коробочный nginx-сервер и так получилось, что нет возможности включить кэшированние "каких захотим" файлов. У многих файлов оно и так включено по стандартным настройкам (css, js, png, jpeg и т.д), но вот SVG-файлы ... для них - нет.

В голову пришло кое-что интересное. Написать примерно такой скрипт:

header('Cache-Control: max-age=604800');
header('Location: ' . $_GET['path'], true, 301);


Ну и слать запросы в стиле
file.php?path=/my/file.svg

Вопрос: Что закэширует браузер в данном случае? Факт редиректа на файл или еще и саму svg-шку?
  • Вопрос задан
  • 1046 просмотров
Решения вопроса 1
Vamp
@Vamp
Все заголовки относятся исключительно к своему ответу. После получения редиректа барузер сгенерирует новый отдельный запрос к ресурсу /my/file.svg и сервер вместе с ним вернёт свои заголовки, относящиеся только к этому ресурсу и в этих заголовках кеширующей директивы не будет.

Так что в вашем случае будет закеширован редирект. То есть браузер запомнит что урл "file.php?path=/my/file.svg" редиректится на "/my/file.svg" (в принципе, он это запомнит и без дополнительного Cache-Control) и если встретит где-то на странице первый урл, то отправит запрос сразу на второй урл, минуя запрос на первый.

Вам нужно отдавать контент картинки непосредственно самим скриптом:
header('Content-Type: image/svg+xml');
// public явным образом разрешает кешировать контент не только на
// устройстве пользователя, но и на любом промежуточном кеширующем http сервере,
// если такой будет стоять между вами и пользователем
// например, провайдерский или в офисах
header('Cache-Control: public, max-age=604800');

// ОСТОРОЖНО!!! Сначала произведите валидацию
// параметра path перед передачей его в readfile()!
readfile($_GET['path']);

Это не должно быть напряжно по ресурсам. Всё-таки кешируется на неделю.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы