我试图让我的 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/Configuration 和 http://www.codetrax.org/projects/wp-add-headers/wiki/Filter_and_Action_Hooks
所以希望这可以防止其他人像我一样失去理智,我差点就认为 Apache 发生了一些事情,而与此同时不那么无辜的 Wordpress 也在做同样的事情。
我知道我终于可以完全控制我的标题了,通过这个插件的钩子和过滤器,我可以自定义缓存时间,即使在单个页面上,尤其是在购物车系统之类的东西上,我可以将其设置为零秒缓存。 很简单 :)