CentOS7中Apache未按httpd.conf配置读取DocumentRoot的问题求助
看起来你遇到的问题核心是目录权限链不完整加上SELinux的限制,导致Apache没法正常访问到public目录下的.htaccess,反而误去上级目录查找。下面一步步来解决:
1. 修复目录权限链
Apache运行的用户(CentOS7里默认是apache)需要对整个目录路径有执行权限(x权限)才能遍历到public目录,同时public目录和内部文件需要有可读权限。执行以下命令:
# 给整个项目目录设置正确的所有者和组 chown -R apache:apache /var/www/html/myProject # 给所有目录设置755权限(所有者可读可写可执行,组和其他可读可执行) find /var/www/html/myProject -type d -exec chmod 755 {} \; # 给所有文件设置644权限(所有者可读可写,组和其他可读) find /var/www/html/myProject -type f -exec chmod 644 {} \; # 单独确保public目录权限正确 chmod 755 /var/www/html/myProject/public
2. 确认Apache的AllowOverride配置
虽然你已经修改了DocumentRoot,但要确保public目录的配置段里开启了AllowOverride All,这样Apache才会读取public下的.htaccess文件。
打开/etc/httpd/conf/httpd.conf,找到你设置的<Directory "/var/www/html/myProject/public">段落,确保内容包含:
AllowOverride All Require all granted
修改完成后重启Apache:
systemctl restart httpd
3. 处理SELinux限制
CentOS7默认开启SELinux,这是很多权限问题的“隐形杀手”,即使文件权限看起来正确,SELinux也可能阻止Apache访问文件。
先临时关闭SELinux测试(重启服务器后会恢复默认状态):
setenforce 0
如果此时能正常访问项目,说明确实是SELinux的问题。接下来设置永久规则,让Apache有权访问项目目录:
# 给项目目录添加httpd允许访问的SELinux上下文标签 semanage fcontext -a -t httpd_sys_content_t "/var/www/html/myProject(/.*)?" # 应用标签到目录 restorecon -Rv /var/www/html/myProject
4. 清理多余的.htaccess文件
检查/var/www/html/myProject根目录下是否存在多余的.htaccess文件,如果有的话建议删除——Laravel的.htaccess本来就应该在public目录下,上级目录的.htaccess会干扰Apache的路径解析。
完成以上步骤后,再次重启Apache,应该就能通过服务器IP正常访问你的Laravel项目了。
内容的提问来源于stack exchange,提问作者shay k

