Назад | Перейти на главную страницу

Несогласованный кеш и заголовки с истекшим сроком действия (pragma: nocache)

Я пытался заставить свой Apache Server (v2.4.7) отвечать на заголовок If-Modified-Since, отправленный браузерами и пауками, такими как Google. Я нашел это по рекомендации Google Webmaster. Я не знал об этом до вчерашнего дня и не знал, что Apache не отвечает на этот заголовок и, следовательно, не отправляет обратно заголовок Last-Modified браузеру или пауку.

Я также заметил, что каждый запрос с моего сервера отправлял обратно прагму: nocache

После долгого чтения и возни я действительно заработал на моем основном сайте.

Это произошло только после того, как я обнаружил, что параметр в php.ini для php-fpm называется session.cache_limiter, для которого установлено значение nocache, поэтому я установил его на session.cache_limiter = public

Перезагрузил сервер и вуаля, этот сайт давал правильные заголовки и передавал различные тестеры заголовков If-Modified-Since.

Теперь проблема .... на всех остальных 15 моих сайтах wordpress они по-прежнему отправляют заголовок pragma: nocache и ни один из других заголовков кеша, которые отображаются на основном сайте.

Все сайты имеют одинаковую конфигурацию в своих файлах apache .conf. Все сайты имеют одинаковую конфигурацию в их .htaccess. Все сайты работают под управлением Wordpress.

Я пытался на других сайтах устанавливать и отключать заголовки в файлах apache .conf, но они просто игнорируются.

На всю жизнь мне что-то не хватает, и я не знаю, где и что, целыми днями просматривал файлы .conf, .htaccess и php.ini.

Что-то мешает заголовкам и я не знаю что.

Это мои загруженные модули Apache, если это поможет

Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 actions_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 evasive20_module (shared)
 expires_module (shared)
 fastcgi_module (shared)
 filter_module (shared)
 headers_module (shared)
 mime_module (shared)
 mpm_event_module (shared)
 negotiation_module (shared)
 pagespeed_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 spamhaus_module (shared)
 ssl_module (shared)
 status_module (shared)

и это результат -V

Server version: Apache/2.4.7 (Ubuntu)
Server built:   Jan 14 2016 17:45:23
Server's Module Magic Number: 20120211:27
Server loaded:  APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

Я действительно в тупике прямо сейчас, но я еще не перестал искать, надеясь, что кто-то сможет пролить свет на то, что может мешать / отменять отправляемые заголовки.

Чтобы добавить в мою путаницу сейчас ... сайт, на котором он отправляет заголовок Last-Modified, неверен на каждой странице

Последнее изменение: Вт, 2 декабря 2014 г., 11:21:14 GMT

Если я посмотрю на отдельные ресурсы на странице, у них будет правильный Last-Modified

как мой style.css показывает Последнее изменение: чт, 2 июня 2016 г., 09:41:24 GMT

Таким образом, он дает ответы Last-Modified, но на верхнем уровне, т.е. сама страница имеет дату в далеком прошлом.

На веб-сайте, где он не отправляет заголовок Last-Modified, это действительно так, но он отправляет их только для ресурсов на странице, таких как css, jpg и т.д. и т.д., но НЕ для самой страницы.

Итак .... 1 проблема превращается в 2.

Где, черт возьми, это происходит и откуда это свидание?

Это ошибка Apache? Ошибка Wordpress?

Я даже отключил плагины на сайтах wordpress, не отправляя заголовок Last-Modified для страницы, но это не повлияло.

Я все еще думаю, что это происходит где-то внутри Apache или PHP.

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

Проблема в том, что Wordpress удаляет заголовки Etag, Last-Modified, Expires и Cache-Control со всех страниц и сообщений.

Но для тех, кто хочет фактического контроля над тем, что можно кэшировать, а не кэшировать, этот контроль просто удаляется.

Выражаем благодарность человеку, который написал такой плагин для Wordpress, и он просто работает из коробки. Его также можно дополнительно настроить, добавив функции, фильтры и перехватчики в файл functions.php вашей темы.

Плагин можно получить из: https://wordpress.org/plugins/add-headers/

Подробная информация и полная документация по плагину:

http://www.codetrax.org/projects/wp-add-headers/wiki/Configuration и http://www.codetrax.org/projects/wp-add-headers/wiki/Filter_and_Action_Hooks

Так что, надеюсь, это спасет кого-то еще от потери рассудка, как я чуть было не думал, что что-то происходит с Apache, в то время как не такой уж невинный Wordpress делал это.

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