不一致的缓存和过期标头(pragma:nocache)

不一致的缓存和过期标头(pragma:nocache)

我试图让我的 Apache 服务器 (v2.4.7) 响应由浏览器和 Google 等蜘蛛程序发送的 If-Modified-Since 标头。我在 Google Webmaster 上的推荐中发现了这一点。直到昨天我才知道这一点,也不知道 Apache 没有响应该标头,因此没有向浏览器或蜘蛛程序发送 Last-Modified 标头。

我还注意到,我的服务器的每个请求都发回了 pragma: 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 标头的网站在每个页面上都是错误的

最后修改时间:2014 年 12 月 2 日星期二 11:21:14 GMT

如果我查看页面内的各个资源,它们都有正确的 Last-Modified

就像我的 style.css 显示的一样最后修改时间:2016 年 6 月 2 日星期四 09:41:24 GMT

因此,它给出了 Last-Modified 的响应,但在顶层,即页面本身,它的日期是过去的。

在没有发送 Last-Modified 标头的网站上,它实际上是发送的,但它仅为页面中的资源(如 css、jpg 等)发送它们,而不是为页面本身发送它们。

所以.... 1 个问题变成了 2 个。

这到底发生在哪里?这个日期是从哪里得到的?

这是 Apache 漏洞还是 Wordpress 漏洞?

我甚至尝试过禁用 wordpress 网站上的插件而不发送页面的 Last-Modified 标头,但这没有效果。

我仍然认为这发生在 Apache 或 PHP 内部的某个地方。

答案1

我希望这可以帮助其他在 Apache 上运行 Wordpress 网站的人,我发现了这个问题,它与 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/Configurationhttp://www.codetrax.org/projects/wp-add-headers/wiki/Filter_and_Action_Hooks

所以希望这可以防止其他人像我一样失去理智,我差点就认为 Apache 发生了一些事情,而与此同时不那么无辜的 Wordpress 也在做同样的事情。

我知道我终于可以完全控制我的标题了,通过这个插件的钩子和过滤器,我可以自定义缓存时间,即使在单个页面上,尤其是在购物车系统之类的东西上,我可以将其设置为零秒缓存。 很简单 :)

相关内容