You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker搭建Drupal环境出现403 Forbidden错误,寻求解决方法

Drupal Docker环境403 Forbidden错误排查与解决

问题背景

搭建了包含Drupal、MySQL、phpMyAdmin的Docker环境,访问8085端口的Drupal时出现403 Forbidden错误。以下是docker-compose.yml配置:

services:
  drupal:
    image: drupal:9
    container_name: drupal
    ports:
      - "8085:80"
    volumes:
      - ./drupal:/var/www/html
    depends_on:
      - db
    networks:
      - drupal-network
  db:
    image: mysql:5.7
    container_name: drupal-db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: drupal
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - drupal-network
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin-drupal
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root
    depends_on:
      - db
    networks:
      - drupal-network
volumes:
  db-data:
networks:
  drupal-network:
    driver: bridge

问题现象

  • 访问http://localhost:8085时显示403 Forbidden错误
  • Drupal容器启动成功,日志无异常,但页面无法加载
  • phpMyAdmin在8081端口运行正常

已尝试操作

  • 执行docker-compose restart重启所有容器
  • 验证MySQL凭证正确,确认Drupal已配置好数据库连接

可能原因与解决方法

1. 本地挂载目录权限不匹配

你将本地./drupal目录挂载到容器内的/var/www/html,但本地目录的所有者和容器内Apache运行的www-data用户(UID通常为33)不匹配,导致Apache无法读取目录内容,返回403。

解决步骤:

  • 若本地./drupal目录为空或无重要内容,直接删除后重新初始化:
    rm -rf ./drupal
    docker-compose down
    docker-compose up -d
    
  • 若需要保留本地目录内容,修改目录权限:
    sudo chown -R 33:33 ./drupal
    docker-compose restart drupal
    

2. 挂载空目录导致Drupal核心文件缺失

如果本地./drupal目录是空的,挂载后容器内的/var/www/html也会被覆盖为空,Apache找不到Drupal的index.php入口文件,从而触发403错误。

解决步骤:
停止容器并移除本地空目录,重新启动容器让Drupal镜像自动生成核心文件:

docker-compose down
rm -rf ./drupal
docker-compose up -d

等待1-2分钟让容器完成初始化,再访问http://localhost:8085。

3. 目录结构异常触发Apache访问规则

Drupal镜像的Apache默认配置要求/var/www/html下存在完整的核心文件结构,若挂载后目录缺少core、index.php等关键内容,会被Apache禁止访问。

验证方法:
进入Drupal容器查看目录内容:

docker exec -it drupal ls -la /var/www/html

如果输出为空或缺少核心文件,按上述方法重新初始化目录即可。

4. 端口冲突(低概率)

虽然phpMyAdmin运行正常,但仍可确认8085端口是否被其他进程占用:

lsof -i :8085

若有其他进程占用,修改docker-compose.yml中Drupal的端口映射(比如改为8086:80),然后重启容器。


内容的提问来源于stack exchange,提问作者Novik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:12:09