Intereting Posts
php timestamp utc Конфигурация многоразовых пакетов в Symfony Как получить чужой репозиторий внутри моего репозитория в Doctrine2 / Symfony2? Определите, сколько времени требуется для загрузки файла (PHP) Как на PHP-стороне проверить правильность URL-адреса веб-сайта? что такое нотация «::» в php? преобразовать php-массив в один объект JSON Как закодировать php-функцию или задать параметры для возврата значений высоты NO для изображений? как делить строку, хранящуюся в базе данных myadmin, и искать слово из этой строки в любой последовательности? как мне показать все .jpg картинки в папке, но я хочу только фотографии с сегодняшнего дня Условный пользовательский выход по цене продажи продуктов и обычной цене Twitter API -> обновление профиля bg с php Убедитесь, что в массиве PHP есть только последовательные ключи Ссылка на текущую ссылку с разбивкой по страницам не выделяется Запретить отображение страницы ошибок CSRF по умолчанию в Codeigniter

Является ли мой кеш скриптов PHP (общедоступным) дружественным?

Я завершил небольшое приложение PHP, которое может обслуживать многие документы. Эти документы должны кэшироваться клиентами и прокси.

Поскольку прокси-серверы могут кэшировать мои результаты, я должен быть особенно осторожным, потому что у документов, которые я обслуживаю, могут быть разные типы MIME (согласование контента на основе $ _SERVER ['HTTP_ACCEPT']) и разные языки (в этом порядке: значение $ _POST / $ _GET / URL / значение сеанса PHP / $ _COOKIE value / $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] / значение сценария по умолчанию).

Короче говоря, страница может обслуживаться со многими типами MIME и многими языками с одинаковым URL (вопрос изменился: см. Ниже).

Чтобы помочь кешировать прокси, я использую заголовок «Vary: Accept» в сочетании с заголовком ETag. ETags – это MD5 текущего языка и последняя измененная метка времени.

Я всегда:

  • Отправить заголовок Expires
  • Отправить заголовок Cache-Control
  • Отправить заголовок Last-Modified
  • Отправить заголовок Content-Type
  • Отправьте заголовок ETag (на основе текущего языка и последней временной отметки)
  • Отправить контент-язык
  • Отправьте заголовок «Vary: Accept», если документ XHTML

Теперь с моим вопросом: достаточно ли этого, чтобы помочь кешировать прокси и клиентов? Я пропустил предмет / заголовок?

Чтобы помочь вам, вот заголовок ответа HTTP для тестовой страницы (в моей локальной среде):

" Date Wed, 30 Dec 2009 18:56:26 GMT Server Apache/2.0.63 (Win32) PHP/5.1.0 X-Powered-By PHP/5.1.0 Set-Cookie Tests=697daqbmple2e1daq2dg74ur96; path=/ Expires Wed, 30 Dec 2009 21:56:26 GMT Cache-Control public, max-age=10800 Last-Modified Mon, 28 Dec 2009 15:11:49 GMT Etag "44fa50be4638161a596e4b75d6ab7a94" Vary Accept Content-Language en-us Content-Length 3043 Keep-Alive timeout=15, max=100 Connection Keep-Alive Content-Type application/xhtml+xml; charset=UTF-8 " 

EDIT: ОК. Я понимаю, что в этом случае обслуживание документа со многими MIME и наличие разных языков (которые могут исходить из стольких источников – см. Выше) – это просто плохая конструкция. Если вы хотите сделать это, просто используйте «частный» кеш (без кеша на прокси) … Правильно ли?

Если у каждого языка есть собственный URL-адрес (но каждый URL-адрес может обслуживаться со многими MIME-файлами), моя текущая реализация в порядке для «общего» кеша (кеш на клиентах + прокси)?

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

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

    Я считаю, что в принципе вы должны быть в порядке: добавление заголовка Vary означает, что кеши должны содержать несколько экземпляров ваших данных, с помощью ETag.

    Я бы отметил, однако, что вы не только меняетесь на Accept, но и на Cookie и Accept-Language. Варьирование cookie означает, что прокси должен будет проверять каждый запрос, но должен иметь возможность использовать заголовок If-None-Match, чтобы сервер указывал, какой (уже кэшированный) ETag следует использовать.

    Если ответ меняется как на «Accept», так и «Accept-Language», то оба они должны упоминаться в заголовке ответа «Vary».