
244
Часть
III. Web-протоколы
ка Location, может использоваться повторно, снижая, таким образом, неэф-
фективную нагрузку на сеть и воспринимаемую пользователем задержку. Но
существует предел контролю Web-сервера над ответом. Кэш должен удалять
ноле заголовка Location, прежде чем отправлять ответ клиенту. Исходный
сервер, отказавшись при управлении кэшированием ответа от концепции все
или ничего, может сохранить частичный контроль за ресурсами. Аналогично,
с помощью директивы Cache-Control: no-cache=set-cookie2 исходный сервер
может запретить сохранять в кэше заголовок Set-Cookie2 [KMOOJ.
• no-transform. Директива ответа no-transform аналогична такой же директиве
запроса и используется, чтобы не допустить изменения ответа (например,
уменьшение разрешения изображения).
• must-re validate. Директива must-revalidate позволяет Web-серверу обратить
внимание на то, что для некоторых ответов может оказаться слишком риско-
ванным для кэша возвращать возможно устаревшие копии. Эта директива вы-
нуждает кэш провести дополнительную проверку актуальности ресурса на
сервере-источнике. Более важно то, что если прокси-сервер не может осущест-
вить проверку актуальности на сервере-источнике (например, если про-
кси-сервер не может связаться с Web-сервером), то кэш должен вернуть кли-
енту не устаревший ответ, а сообщение об ошибке. Различие между директи-
вой must-revalidate и похожей на первый взгляд директивой no-cache заклю-
чается в том, что кэши вряд ли сохранят ответы, которые включают директиву
no-cache. Если ответ включает директиву must-revalidate, то он может быть
сохранен в кэше, но актуальность его должна быть проверена. Директива
no-cache вынуждает кэш провести проверку независимо от того, когда этот
ответ устарел. На практике, так как кэши вряд ли сохранят ответы, которые
включают директиву no-cache, запрос на такое содержимое приведет к загруз-
ке данных с сервера-источника, а не просто к их проверке. Использование ди-
рективы must-revalidate по сравнению с использованием директивы no-cache
экономнее в отношении нагрузки па сеть. Однако пользователь, пользующий-
ся «магазинной тележкой» в приложениях электронной коммерции, предпоч-
тет либо точно знать ее содержимое, лР1бо получить сообщение об ошибке, по
не устаревшие данные.
Предположим, что кэш ждет ответа от предыдущего сервера на пути сооб-
ще1Н1я и не получает этот ответ в течение некоторого времени. Если это вы-
нудит кэш отказаться от выполнения директивы must-revalidate, то кэш обя-
зан передать новый код ответа HTTP/1.1 504 Gateway Timeout (как и в слу-
чае директивы only-if-cached). Сервер может выбрать конкретное время для
таймаута. Ответ 504 Gateway Timeout выглядит более содержательным, чем
ответ общего характера 500 Internal Server Error.
Директива управления кэшем no-store гарантирует, что запрос-ответ не
будет сохранен, тогда как no-cache допускает сохранение, но гарантирует, что
не будут возвращаться устаревшие ответы. Директива must-revalidate допус-
кает сохранение ответа, по гарантирует, что устаревшие ответы будут обнов-
ляться. Однако ответ, который кэш считает обновленным, может быть уже
изменен на сервере-источнике. Это различие между директивами является
ключевым для понимания необходимости обеих директив: no-cache и must-
revalidate. Директива no-store вообще исключает кэширование. В случае
no-cache существует возможность кэширования, но отсутствует риск возвра-
щения ответа, который уже изменен. В случае must-revalidate существует ре-