我在使用 mod_expires 时遇到了问题。我只是设置了默认过期时间为 1 天,然后根据类型设置过期时间(针对图像和音频)。
例如,我将 ExpiresByType image/jpeg 设置为“访问时间加 1 个月”。问题是每个页面都有正确的 Expires DateTime,因此其有效期加 1 天,但图像和音频(image/jpeg、image/png、audio/mpeg)的有效期为 12 小时。这是我的配置:
<IfModule mod_cache_disk.c>
CacheRoot /var/cache/apache2/mod_cache_disk
CacheDirLevels 2
CacheDirLength 1
</IfModule>
....
CacheQuickHandler off
CacheLock on
CacheLockPath /tmp/mod_cache-lock
CacheLockMaxAge 5
CacheIgnoreHeaders Set-Cookie
<Location />
CacheEnable disk
CacheHeader on
CacheDefaultExpire 600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.5
ExpiresActive on
ExpiresDefault "access plus 1 days"
ExpiresByType image/jpeg "access plus 1 months"
ExpiresByType image/png "access plus 1 months"
ExpiresByType audio/mpeg "access plus 1 months"
Header merge Cache-Control public
FileETag All
</Location>
....
然后我尝试添加另一个位置,并且不使用 ExpiresByType,但仍然没有成功。这是我尝试的:
<LocationMatch "(.png|.mp3|.jpg|.jpeg)">
ExpiresActive on
Header Set Cache-Control "max-age=1678400"
ExpiresDefault "access plus 1 days"
FileETag All
</LocationMatch>
Cache-Control 标头具有正确的最大年龄,但过期日期仍为 12 小时。
然后我尝试手动设置它,因此我尝试如下操作:
Header Set Expires "Thu, 1 Jan 2020 00:00:00 GMT"
嗯,这是可行的,但我需要将其设置为自上次访问起 1 个月/年。
Apache 仅对实际为当前应用程序提供服务的 gunicorn Web 服务器执行代理传递。
答案1
我遇到了同样的问题,我搞不清楚哪个模块将 Expires 标头设置为 12 小时。我决定根本不使用 mod_expires。(即使在我禁用 mod_expires 模块之后,显然另一个模块设置了 Expire 标头,我找不到哪个模块做了这件事)
因此,我处理这个问题的方式是:
Header unset Expires
# Activate browser-caching without the expires module.
Header merge Cache-Control max-age=604800
<FilesMatch "\.(js|css)$">
Header merge Cache-Control max-age=86400
</FilesMatch>
可以根据需要设置任意数量的 FilesMatch 块。