直接用 location /phpmyadmin 会404或跳转失败,因phpMyAdmin的前端资源路径和后端路由默认基于根路径,Nginx反代未剥离前缀且未设置SCRIPT_NAME与PmaAbsoluteUri,导致请求错发至根目录、重定向错误及静态资源加载失败。

为什么直接用 location /phpmyadmin 会 404 或跳转失败
因为 phpMyAdmin 默认生成的 HTML、CSS、JS 中的链接(比如 index.php、js/messages.php)是相对路径或硬编码根路径,Nginx 反代时若不重写请求路径,这些资源会被发往后端 PHP 服务的根目录(如 /index.php),而非 /phpmyadmin/index.php,导致后端找不到文件或重定向到错误地址。
核心问题不是 Nginx 配置“能不能转发”,而是“转发后整个应用能否在子路径下自洽运行”。phpMyAdmin 本身支持子路径部署,但需要前后端协同:后端识别上下文路径,前端资源路径正确解析。
- 必须设置
$cfg['PmaAbsoluteUri']或启用$cfg['ForceSSL']等配合项(见下一点) - Nginx 的
location块不能只做简单转发,要剥离前缀并补全SCRIPT_NAME - 浏览器访问
/phpmyadmin/末尾带斜杠,否则登录后可能跳回/
phpMyAdmin 必须配置的两个关键项
仅靠 Nginx 转发无法让 phpMyAdmin 在子路径下正常工作。你必须修改其配置文件 config.inc.php(通常在 /usr/share/phpmyadmin/ 或 Web 根目录下):
-
$cfg['PmaAbsoluteUri'] = 'https://yourdomain.com/phpmyadmin/';—— 强制指定完整入口 URL,影响所有生成的链接和重定向 -
$cfg['blowfish_secret']必须非空(已有可跳过),否则登录页直接报错
注意:$cfg['PmaAbsoluteUri'] 的值必须以 / 结尾,且协议、域名、路径需与用户实际访问一致;如果用 HTTP,就写 http://...;如果 Nginx 终止 HTTPS,则后端 PHP 看不到 HTTPS 环境变量,此时建议设为 https:// 并确保 Nginx 透传 X-Forwarded-Proto(见下一点)。
Nginx location 块里最容易漏掉的三件事
以下是最小可用的 location /phpmyadmin/ 配置片段,每行都有明确作用:
location /phpmyadmin/ {
alias /usr/share/phpmyadmin/;
index index.php;
<pre class="brush:php;toolbar:false;">location ~ ^/phpmyadmin/(.+\.php)$ {
alias /usr/share/phpmyadmin/$1;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME /phpmyadmin/$1;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
}
location ~* ^/phpmyadmin/(.+\.(?:js|css|png|jpg|jpeg|gif|ico|svg))$ {
expires 1y;
add_header Cache-Control "public, immutable";
}}
-
alias后必须带尾部/,且路径结尾不能是phpmyadmin(即不能写成/usr/share/phpmyadmin),否则内部重写会出错 -
fastcgi_param SCRIPT_NAME是关键——它告诉 PHP “当前请求逻辑上属于哪个子路径”,否则$_SERVER['SCRIPT_NAME']仍是/index.php,导致路由和重定向失效 - 必须显式设置
HTTP_X_FORWARDED_PROTO,否则 phpMyAdmin 检测到非 HTTPS 时可能拒绝登录(尤其启用了$cfg['ForceSSL'] = true)
访问时路径必须带斜杠,且不能省略
浏览器访问必须是 https://example.com/phpmyadmin/(结尾有 /),而不是 https://example.com/phpmyadmin。
原因:alias 指令在匹配无尾斜杠的请求时,会把 /phpmyadmin 当作文件名处理,导致 Nginx 尝试查找 /usr/share/phpmyadmin 这个“文件”,而非目录,最终返回 404 或下载空白响应。
如果你希望兼容无斜杠访问,可以用 return 301 $scheme://$host$request_uri/; 重定向,但更稳妥的做法是:从一开始就要求带斜杠,并在文档或书签中固化这个习惯。
真正麻烦的点不在配置多复杂,而在于 phpMyAdmin 对子路径的依赖是“全链路”的——前端链接、后端路由、PHP 环境变量、Nginx 路径映射,缺一不可。少设一个 SCRIPT_NAME 或漏掉 PmaAbsoluteUri,都可能表现为登录后白屏、CSS 不加载、点击表跳 404 这类“看起来通了但用不了”的问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











