根本原因是未做动静分离,错误地将所有/phpmyadmin/子路径(含CSS/JS)交由PHP-FPM处理;正确做法是用location /phpmyadmin/服务静态资源(配alias和try_files),再用location ~ ^/phpmyadmin/(.*.php)$专转PHP脚本,并确保alias路径末尾斜杠与location严格匹配。

phpMyAdmin 在 Nginx 下静态资源(CSS/JS/图片)返回 404,根本不是文件丢了,而是 location 匹配逻辑错位或 alias 拼接出错——最常见的是把所有请求都扔给了 PHP-FPM,连 /phpmyadmin/css/common.css 都被当成 PHP 脚本去执行。
为什么 /phpmyadmin/*.css 返回 404?
因为配置里只写了 location /phpmyadmin/,没做动静分离。Nginx 把所有子路径(包括 .css、.js)全交给 fastcgi_pass 处理,而 PHP-FPM 根本不负责返回静态文件,直接 404。
- 典型错误配置:
location /phpmyadmin/ { fastcgi_pass unix:/run/php/php-fpm.sock; ... }—— 这会拦截全部子路径 - 正确思路:静态资源走
location /phpmyadmin/(只服务文件),PHP 脚本走location ~ ^/phpmyadmin/(.*\.php)$(只转发脚本) - 检查方法:用
curl -I https://your.site/phpmyadmin/css/common.css看响应头,如果返回Status: 404且Content-Type是text/html,基本就是被 PHP-FPM 接管了
如何用 alias 正确映射 phpMyAdmin 静态路径?
alias 必须和 location 的末尾斜杠严格对应,漏掉一个 / 就会导致路径粘连,比如请求 /phpmyadmin/js/jquery.js 变成读取 /usr/share/phpmyadminjs/jquery.js(少了个 /)。
-
location /phpmyadmin/→alias /usr/share/phpmyadmin/;(注意两个结尾都有/) - 绝对不能写成
alias /usr/share/phpmyadmin(缺斜杠)或alias /usr/share/phpmyadmin/+location /phpmyadmin(location 缺斜杠) - 加
try_files $uri =404;显式终止匹配,避免 fallback 到 index.php 或其他 location - 确认文件权限:
ls -l /usr/share/phpmyadmin/css/看www-data(或你 Nginx 用户)是否有读权限
为什么加了 alias 还是 404?检查这三处
alias 生效的前提是它真被匹配到了。很多问题出在 location 优先级或正则干扰上。
立即学习“PHP免费学习笔记(深入)”;
- 检查有没有更靠前的正则
location ~ \.php$拦截了所有带点的路径——它会优先于location /phpmyadmin/,导致.css也被当成 PHP 处理 - 运行
nginx -T | grep -A5 'location /phpmyadmin/',确认你改的配置块确实加载进了生效配置里(别改了 include 的文件却忘了 reload) - 临时加一行
return 200 "root: $document_root, uri: $uri, filename: $request_filename";到该location块里,curl 请求看输出的真实路径,比猜快得多
alias 的路径拼接逻辑是硬编码行为,错一个字符、少一个斜杠、大小写不一致,都会让 Nginx 去找一个根本不存在的磁盘路径——而 error.log 里只会写 open() "/xxx" failed (2: No such file),不会告诉你哪一步替换了哪一段。



















