根本原因是Apache默认拒绝一切访问,必须显式授权;需确保Directory路径与DocumentRoot完全一致、块内含Require all granted、SELinux上下文合规、Options配置匹配实际需求,并检查AllowOverride是否启用.htaccess。
Apache 使用 DocumentRoot 配置静态资源时权限正确却仍报 403,根本原因不是文件权限本身错了,而是 Apache 的访问控制机制未放行——它默认“拒绝一切”,必须显式授权才能访问。
改了 DocumentRoot "/var/www/my-site",但没改对应 <Directory "/var/www/my-site"> 块,Apache 仍按旧路径(比如 /var/www/html)或根目录 <Directory "/"> 的规则执行。而后者常含 Deny from all 或 Require all denied,直接拦截所有请求。
<Directory> 路径与 DocumentRoot 完全一致(字符、斜杠、大小写都不能差)<Directory> 块内是否包含 Require all granted(Apache 2.4+)或 Allow from all(2.2 及更早)<Directory "/"> 拒绝了,内层再怎么放行也无效如果依赖 .htaccess 控制访问(比如加密码、重定向),但对应 <Directory> 中设了 AllowOverride None,Apache 就会忽略 .htaccess 里的 Require 等指令,导致本该放行的规则不生效,最终返回 403。
AllowOverride All,确认是否是此问题AllowOverride AuthConfig FileInfo
即使 Linux 文件权限(755/644)和 Apache 配置都正确,SELinux(RHEL/CentOS/Fedora)或 AppArmor(Ubuntu/Debian)仍可能阻止 httpd 进程读取目标路径。
sudo sestatus 查看 SELinux 是否启用;若为 enabled,执行 sudo setsebool -P httpd_read_user_content 1 允许读取用户目录ls -Z /var/www/my-site,确保目录标签类似 httpd_sys_content_t;否则用 sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/my-site(/.*)?" + sudo restorecon -Rv /var/www/my-site
sudo aa-status,并确认 profile 是否允许访问该路径Options 决定 Apache 对目录能做什么。若没启用 FollowSymLinks 却用了软链接,或没开 Indexes 又访问无索引页的空目录,也会触发 403。
Options FollowSymLinks(允许跟随符号链接)Indexes;否则确保目录下有 index.html 等默认文件None,除非明确知道每个子功能都被单独启用