为什么Apache2 mod_cache提供目录索引而不是index.php?

时间:2018-11-15 12:43:32

标签: php apache apache2 lamp mod-cache

我在DigitalOcean Droplet上运行了多站点WordPress安装。我添加了Apache的HashSet模块来缓存我网站上的内容,但是我遇到了一个非常奇怪的问题。设置缓存后,在第一页加载中,站点加载正常。但是,在随后的页面加载中,我得到的是目录索引而不是index.php:

enter image description here

如果我清除缓存,则下一页工作正常。似乎mod_cache正在缓存目录索引HTML页面,而不是mod_cache的呈现输出。

这是我的网站配置:

index.php

这是我的<IfModule mod_ssl.c> <VirtualHost *:443> ServerName jeremydormitzer.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html/jeremydormitzer.com ErrorLog /var/log/jeremydormitzer.com/error.log CustomLog /var/log/jeremydormitzer.com/access.log combined <Directory /var/www/html/jeremydormitzer.com/> AllowOverride All </Directory> RewriteEngine on LoadModule cache_module modules/mod_cache.so <IfModule mod_cache.c> LoadModule cache_disk_module modules/mod_cache_disk.so <IfModule mod_cache_disk.c> CacheEnable disk / CacheDisable /wp-admin </IfModule> CacheLock on CacheLockPath "/tmp/mod_cache-lock" CacheLockMaxAge 5 CacheDisable "http://security.update.server/update-list/" </IfModule> Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/qa.getpterotype.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/qa.getpterotype.com/privkey.pem </VirtualHost> </IfModule>

cache_disk.conf

这是我的<IfModule mod_cache_disk.c> CacheRoot /var/cache/apache2/mod_cache_disk CacheDirLevels 2 CacheDirLength 1 </IfModule>

apache2.conf

有人知道这是怎么回事吗?


更新

根据要求,这是我的网站Mutex file:${APACHE_LOCK_DIR} default PidFile ${APACHE_PID_FILE} Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} HostnameLookups Off ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn IncludeOptional mods-enabled/*.load IncludeOptional mods-enabled/*.conf Include ports.conf <Directory /> Options FollowSymLinks AllowOverride None Require all denied </Directory> <Directory /usr/share> AllowOverride None Require all granted </Directory> <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> <Directory /var/www/html> AllowOverride All </Directory> AccessFileName .htaccess <FilesMatch "^\.ht"> Require all denied </FilesMatch> LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent IncludeOptional conf-enabled/*.conf IncludeOptional sites-enabled/*.conf ServerName 104.236.87.208 UseCanonicalName On 在根路径下的内容:

.htaccess

2 个答案:

答案 0 :(得分:1)

我发现了问题所在。有两个:

问题1

mod_cache在服务器处理管道中运行太早。这意味着它在调用PHP脚本之前就缓存了内容,从而导致它缓存了目录索引。要解决此问题,我在配置文件中关闭了CacheQuickHandler

CacheQuickHandler off

问题2

我的.htaccess文件(由WordPress自动生成)正在将所有URI重写为/index.php

RewriteRule . /index.php [L]

这导致每个页面都以index.php的形式缓存,这意味着无论何时您访问我网站上的页面,Apache都会提供最后访问的页面。

更改它以将URI重写为index.php/<the path>可以解决此问题:

RewriteRule ^(.*)$ /index.php/$1 [L]

感谢this ServerFault answer为我指出正确的方向。

答案 1 :(得分:0)

不确定,但是当我看这里https://httpd.apache.org/docs/2.2/mod/mod_cache.html 该示例具有mod_disk_cache,并且您的代码似乎具有mod_cache_disk?