遭遇 phpMyAdmin 403 You don't have permission to access /phpmyadmin/ on this server 是運維常見痛點。本文梳理從 SELinux、文件權限到 Apache 訪問控制的完整排查鏈路,直擊核心配置缺失。
403 核心原因:Apache 進程(通常以 apache/www-data 用戶運行)無權讀取 /usr/share/phpmyadmin 目錄,或虛擬主機配置缺少 Allow 指令。
# 確保目錄可讀、可遍歷
chmod 755 /usr/share/phpmyadmin
chmod 644 /usr/share/phpmyadmin/*.php
# 所有權歸 Apache 運行用戶(非必須,但需可讀)
chown -R root:root /usr/share/phpmyadmin # 保持 root 所有即可,關鍵是權限位
若 getenforce 返回 Enforcing,必須賦予正確類型標籤:
# 查看當前上下文
ls -Z /usr/share/phpmyadmin
# 應為 httpd_sys_content_t,否則執行:
semanage fcontext -a -t httpd_sys_content_t "/usr/share/phpmyadmin(/.*)?"
restorecon -Rv /usr/share/phpmyadmin
# 或臨時關閉驗證(不推薦生產):
setenforce 0
編輯 /etc/httpd/conf.d/phpmyadmin.conf(或 apache2/conf-available/phpmyadmin.conf),確保別名目錄有明確授權:
<Directory "/usr/share/phpmyadmin/">
Options None
AllowOverride None
# Apache 2.4 語法
Require all granted
# Apache 2.2 兼容語法(舊版系統)
Order allow,deny
Allow from all
</Directory>
Alias /phpmyadmin /usr/share/phpmyadmin
Alias /phpMyAdmin /usr/share/phpmyadmin
Alias /mysqladmin /usr/share/phpmyadmin
注意:Apache 2.4 建議僅使用 Require all granted,避免新舊指令混用導致邏輯衝突。
systemctl reload httpd # 或 service httpd restart
Order/Allow,2.4 用 Require,混寫可能導致 Require all granted 被 Order deny,allow 覆蓋拒絕。<VirtualHost> 內授權,而非全局。https://IP/phpmyadmin/ 返回登錄頁(非 403/404)。curl -I https://localhost/phpmyadmin/ 返回 200 OK。audit2why < /var/log/audit/audit.log 無 phpMyAdmin 相關 AVC 拒絕。遵循「文件權限 → SELinux 上下文 → Apache 授權指令」三步走,90% 的 403 故障可在分鐘級解決。核心原則:Apache 進程需具備目錄遍歷權限(x 位)與文件讀取權限(r 位),且在 DAC 與 MAC 兩層授權體系中均通過。