为何Docker容器中部分PHP页面无法加载?
解决PHP容器化后非index.php页面404问题
可能的原因及对应解决方法
1. 文件权限与所有权问题
容器中Apache以www-data用户运行,若项目文件所有权为root,会导致Apache无法正常读取文件。
修改Dockerfile,添加权限配置:
FROM php:8.2.5-apache as php WORKDIR /var/www/html COPY ./ ./ # 将文件所有权设置为Apache运行用户 RUN chown -R www-data:www-data /var/www/html # 配置目录和文件的可读可执行权限 RUN chmod -R 755 /var/www/html EXPOSE 80
2. Apache重写模块与.htaccess配置缺失
本地Mac默认Apache通常开启了mod_rewrite模块,并允许.htaccess覆盖规则,但官方php:apache镜像默认未开启这些配置,若你的网站依赖.htaccess规则(哪怕是直接访问.php文件),就会出现404。
修改Dockerfile,开启模块并调整Apache配置:
FROM php:8.2.5-apache as php WORKDIR /var/www/html COPY ./ ./ # 启用mod_rewrite模块 RUN a2enmod rewrite # 修改Apache主配置,允许/var/www/html目录下的.htaccess生效 RUN sed -i '/<Directory \/var\/www\/html\/>/,/<\/Directory>/ s/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf # 配置文件权限 RUN chown -R www-data:www-data /var/www/html RUN chmod -R 755 /var/www/html EXPOSE 80
3. 验证配置有效性
构建新镜像并启动容器后,可进入容器检查配置是否生效:
# 进入容器 docker exec -it <container_id> bash # 检查mod_rewrite是否开启 apache2ctl -M | grep rewrite # 查看目录权限配置 cat /etc/apache2/apache2.conf | grep -A 10 "<Directory /var/www/html/>"
4. 无后缀URL适配(若适用)
如果你的网站使用无后缀URL(如访问/about而非/about.php),需确保.htaccess中有重写规则,示例:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ $1.php [L]
内容的提问来源于stack exchange,提问作者Gregg
相关产品推荐
相关产品推荐

