Ubuntu环境下Docker出现403 Forbidden错误,疑似无法定位index.php
问题分析与修复方案
核心问题
你遇到的403 Forbidden错误主要源于三个关键问题:
- 容器卷挂载路径错误,导致Apache无法找到你的
index.php文件 - Dockerfile中修改Apache文档根目录时,未定义
APACHE_DOCUMENT_ROOT环境变量,替换操作无效 - 未确保Apache进程能访问挂载目录内的文件(权限配置缺失)
具体修复步骤
1. 修正docker-compose.yml的卷挂载配置
你的index.php位于项目根目录的src文件夹,需要将宿主机的src目录正确挂载到容器内Apache的文档根目录。原配置缺少容器内目标路径,属于错误写法,修改如下:
services: apache-php: image: apache-pdo build: context: . dockerfile: Dockerfile volumes: # 将宿主机src目录挂载到容器默认Apache文档根目录 - /home/marnix/Documents/hacklab_php/book_management_system/src:/var/www/html ports: - "80:80" networks: - app-network # 其余mysql、phpmyadmin服务配置保持不变 networks: app-network: driver: bridge
2. 修复Dockerfile的基础配置与文档根设置
原Dockerfile缺少FROM基础镜像指令(致命错误),且文档根替换逻辑无效,以下是两种修复方案:
方案一:使用默认Apache文档根(新手推荐)
直接基于官方php-apache镜像构建,保留默认文档根/var/www/html,修改后的Dockerfile:
# 必须添加基础镜像,选择对应PHP版本的apache镜像 FROM php:8.2-apache RUN docker-php-ext-install pdo pdo_mysql EXPOSE 80 LABEL org.opencontainers.image.source="https://github.com/MilesChou/docker-xdebug" \ repository="https://github.com/MilesChou/docker-xdebug" \ maintainer="MilesChou <jangconan@gmail.com>" RUN pecl install xdebug \ && docker-php-ext-enable xdebug
方案二:自定义文档根(按需选择)
若需将文档根改为自定义路径(如/var/www/src),需先定义环境变量再替换配置:
FROM php:8.2-apache # 定义自定义文档根环境变量 ENV APACHE_DOCUMENT_ROOT /var/www/src RUN docker-php-ext-install pdo pdo_mysql EXPOSE 80 # 替换Apache配置中的路径 RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf # 创建自定义文档根目录 RUN mkdir -p ${APACHE_DOCUMENT_ROOT} LABEL org.opencontainers.image.source="https://github.com/MilesChou/docker-xdebug" \ repository="https://github.com/MilesChou/docker-xdebug" \ maintainer="MilesChou <jangconan@gmail.com>" RUN pecl install xdebug \ && docker-php-ext-enable xdebug
此方案需同步修改docker-compose.yml的volumes配置,将宿主机src挂载到/var/www/src
3. 解决Ubuntu宿主机文件权限问题
Ubuntu下宿主机文件权限可能导致容器内Apache无法访问,执行以下命令修正:
# 设置目录可读可执行权限 chmod -R 755 /home/marnix/Documents/hacklab_php/book_management_system/src # 将目录所有者改为Apache运行用户(容器内与宿主机www-data用户ID一致) chown -R www-data:www-data /home/marnix/Documents/hacklab_php/book_management_system/src
4. 重新构建并启动容器
执行命令完成镜像重建与服务启动:
# 停止并清理旧容器 docker-compose down # 重新构建镜像 docker-compose build # 后台启动服务 docker-compose up -d
额外排查点
- 确认
index.php确实在src目录下,且文件名大小写正确(Linux系统区分大小写) - 若仍报错,查看Apache日志定位具体问题:
docker-compose logs apache-php
内容的提问来源于stack exchange,提问作者Marnix de Brock
相关产品推荐
相关产品推荐

