phpmyadmin的css/js不走强缓存,因其默认无cache-control头且常通过/index.php?route=动态加载,url无哈希;需在nginx中用^~ /themes/ location配合alias和add_header强制生效,并重写动态请求为静态路径。

为什么 phpMyAdmin 的 CSS/JS 不走强缓存?
phpMyAdmin 默认不设 Cache-Control,浏览器每次请求都回源;它还常通过 index.php?route=/theme 动态加载主题资源,导致 URL 无哈希、无版本号,max-age 再长也无效——因为 Nginx 默认不会对带 ? 的 URI 缓存(除非显式配置 proxy_cache_key 包含参数)。
给 phpMyAdmin 主题静态资源配 Cache-Control: public, immutable
关键不是“能不能加”,而是“加在哪才生效”。phpMyAdmin 的主题文件(如 /themes/pmahomme/css/common.css)通常由 PHP 脚本动态输出,但实际内容稳定。必须绕过 PHP 路由,直接匹配物理路径:
- 确认主题资源真实路径,例如
/usr/share/phpmyadmin/themes/pmahomme/css/ - 在 server 块中添加独立 location,**必须放在 phpmyadmin 主 location 之前**(避免被
location ~ \.php$拦截):
location ^~ /themes/ {
alias /usr/share/phpmyadmin/themes/;
add_header Cache-Control "public, max-age=31536000, immutable";
expires 1y;
sendfile on;
}
注意:alias 后路径末尾必须有 /,且 ^~ 优先级高于正则,确保不被 PHP 处理器劫持。
避免 index.php?route= 动态路径干扰缓存
phpMyAdmin 前端可能仍通过 /index.php?route=/theme/css/common.css 请求资源——这种请求无法用 alias 直接命中,必须强制重写为静态路径:
- 在 phpmyadmin 的主 location 块内(
location /或location ~ \.php$上方),加 rewrite 规则:
location / {
# 拦截 theme 静态资源请求,转为物理路径
if ($args ~* "^route=/theme/(css|js|images)/(.+)$") {
set $theme_path /themes/$1/$2;
rewrite ^.*$ $theme_path last;
}
# 其余请求照常交给 PHP 处理
try_files $uri $uri/ /index.php?$args;
}
这样 /index.php?route=/theme/css/common.css 就会重写成 /themes/css/common.css,最终落入上一个 location ^~ /themes/ 块生效。
验证是否真命中强缓存
别只看响应头有没有 Cache-Control,要确认浏览器是否真的跳过请求:
- 用
curl -I https://your.domain/themes/css/common.css检查返回头是否含Cache-Control: public, max-age=31536000, immutable - 打开浏览器 DevTools → Network,刷新页面,找对应 CSS 文件:Status 显示
200 (from disk cache)或200 (from memory cache)才算成功 - 如果仍是
200 OK且 size > 0,说明还在回源——大概率是 location 顺序错了,或 rewrite 没匹配上
最易忽略的一点:phpMyAdmin 升级后,/themes/ 目录结构可能变(比如新版改用 /public/themes/),路径写死却没同步更新,缓存规则就彻底失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











