Кэширование удаляемых изображений с использованием параметров запроса - PullRequest
0 голосов
/ 05 июля 2019

Я получаю изображение из источника URL, используя параметры запроса, такие как:

www.server.com / get? Img.jpg

Но когда сервер изменяет изображение,Я не могу получить последнюю копию, потому что изображение кэшируется.Большинство ответов здесь на stackoverflow говорят, что добавляют параметр запроса для очистки кэша, но это не работает в этом случае.Пробовал:

www.server.com / get? Img.png & id = 1123

Есть какие-нибудь мысли / рекомендации?Спасибо

Редактировать: число после id = является случайным.

1 Ответ

1 голос
/ 05 июля 2019

В таких случаях параметры запроса подразумевают, что всегда изменяется . Если вы просто добавите &id=1123, это ничего не изменит.

Попробуйте добавить &t=nnnn с nnnn, например, равным текущему времени в секундах.

Или, если вы сгенерируете ссылку на том же сервере, лучше использовать * nnnn время модификации изображения в секундах или отметку времени:

?img.png&t=2019-07-04.17.03.22

UPDATE

Вы говорите, что как-то

 http://www.server.com/get?img.png&id=1

и

 http://www.server.com/get?img.png&id=2

обрабатываются браузером как одно и то же изображение. Я нахожу это трудным для принятия, потому что это будет (среди прочего) недостаток безопасности - это означает, что, скажем, get?report.pdf&user=whoknows&password=whatever может закончить загрузкой get?report.pdf&user=realuser&password=realpassword без необходимости предоставлять реальную информацию для входа во второй раз.

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

Почему сервер может это делать, это объясняется проще всего: сервер или какая-то кеширующая система перед ним удаляет дополнительные параметры. Таким образом, вы можете спросить id = x273y3 столько, сколько захотите, чтобы эта информация никогда не доходила до сервера и не могла заставить ее что-либо делать. Было бы интересно узнать, каков был вариант использования для этого.

В некоторых ограниченных случаях вы можете сделать это с помощью уродливого хака - если вы запрашиваете 12345/../img.png вместо img.png, и разбор пути выполняется только правильным способом, то слой кэша может не кэшировать запрос и все же сервер все еще отвечает с более новым изображением. Но это хрупкий взлом, потому что множество законных изменений в архитектуре сервера может привести к его полному разрушению, в результате чего изображение вообще не отправляется.

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

Особенно, если кто-то зашел так далеко, как разбор параметров, он должен был вместо этого должным образом поддерживать директивы кэша.

(С другой стороны, если у вас есть сервер, который игнорирует и законных заголовков и запрашивает хаки, у вас есть достаточно веские доводы в пользу того, что бы ни случилось у них на голове).

В противном случае может случиться так, что клиент считает, что он может кэшировать ресурс, потому что он был отправлен с определенными заголовками ресурса (ETag и т. Д.), И повторная проверка кэша не завершается должным образом из-за клиента / непонимание сервера, что тоже случается довольно часто. Вы должны записать полный набор разговоров и опубликовать их здесь, чтобы помочь описать проблему:

  • заголовки первого запроса к изображению
  • заголовки ответа
  • заголовки запроса к изображению, которое тем временем изменилось
  • заголовки ответа на этот вопрос

Это также может быть что-то очень простое, например, сервер на самом деле отвечает фиксированным 302, который лишает дополнительных параметров. Затем кешируется новый URL:

GET /get?img.png & ... 302 Расположение: http://static -images.server.com / images / img.png

Это может произойти из-за слишком тщательного правила перезаписи движка переписывания сервера Apache, например, где "\? (. *. (Png | jpg | gif))" взято из исходного запроса и переписано в "NewLocation / $ 1". В таком случае другой хрупкий обходной путь будет заключаться в том, чтобы запросить /get?img.png?t=12345.png с двумя ?, чтобы обмануть механизм перезаписи для захвата img.png? T = 12345 вместо просто img, включая кеш разорение.

Однако правильное, хотя и более длительное, исправление состоит в том, чтобы переписывать людей и кеш, с которыми они общались и сотрудничали, вместо того, чтобы работать с разногласиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...