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

Docker化Drupal7本地正常,Apache反向代理后静态资源加载失败

问题描述

已成功将现有Drupal7网站Docker化,本地通过http://localhost:8006访问一切正常,但通过Apache2反向代理(HTTPS)部署后,仅能显示基础HTML,JS/CSS无法加载,files目录下非图片文件访问返回404,服务器端无报错日志。

相关配置如下:

Dockerfile

# Dockerfile
FROM drupal:7.101-php8.2-apache
COPY webroot /var/www/html
WORKDIR /var/www/html
EXPOSE 8006

docker-compose.yaml

# docker-compose.yaml
services:
  mysql:
    image: mysql:5.7
    command: --max_allowed_packet=32505856
    container_name: dbname
    restart: always
    volumes:
      - ./dbname.sql:/docker-entrypoint-initdb.d/dbimport.sql
      - ./dbdata:/var/lib/mysql
      - /tmp/dbname/mysqld:/var/run/mysqld
    environment:
      MYSQL_ROOT_PASSWORD: some_password
      MYSQL_DATABASE: dbname
      MYSQL_USER: webadmin
      MYSQL_PASSWORD: some_password
    healthcheck:
      test: ["CMD", "mysqladmin", "-u", "webadmin", "-psome_password", "ping", "-h", "localhost"]
      timeout: 10s
      retries: 10
    ports:
      - "3304:3306"

  drupal:
    container_name: my_drupal
    build:
      context: ./
      dockerfile: Dockerfile
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./files:/var/www/html/files
      - /tmp/dbname/mysqld:/var/run/mysqld
    working_dir: /var/www/html
    restart: always
    ports:
      - "8006:80"

volumes:
  dbdata:

Apache2反向代理配置(mysite.conf)

# mysite.conf
<VirtualHost *:443>
    ServerName  mysite.com
    ServerAdmin me@mysite.com
    Protocols h2 http/1.1

    SSLEngine on
    SSLCertificateFile "/etc/ssl/certs/mycert.crt"
    SSLCertificateKeyFile "/etc/ssl/private/mycert.key"
    SSLCertificateChainFile "/etc/ssl/certs/mycert.chain.crt"

    <Directory "/">
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>

    ProxyPreserveHost on
    ProxyPass / http://localhost:8006/
    ProxyPassReverse / http://localhost:8006/

    ErrorLog /var/log/apache2/mysite.errors.log
</VirtualHost>
排查方向
  • 检查混合内容拦截问题:本地用HTTP访问,线上代理用HTTPS,打开浏览器控制台查看资源请求地址,确认是否存在HTTP资源被浏览器拦截。解决方式:在Drupal后台站点配置 > 站点信息中把站点地址设为https://mysite.com,或直接修改sites/default/settings.php添加$base_url = 'https://mysite.com';。
  • 验证Drupal的base_url配置:确认Drupal生成资源路径时使用的是正确的域名和协议,避免出现http://localhost:8006的资源路径。
  • 完善Apache反向代理的资源重写规则:启用mod_proxy_html模块,在VirtualHost配置中添加:
    ProxyHTMLEnable On
    ProxyHTMLURLMap http://localhost:8006/ https://mysite.com/
    
    确保HTML中的资源路径被正确替换为HTTPS地址。
  • 检查files目录权限与访问规则:
    • 执行docker exec my_drupal chown -R www-data:www-data /var/www/html/files,确保容器内files目录归www-data用户所有。
    • 检查Drupal根目录的.htaccess文件,确认没有对非图片文件设置访问限制;同时确认反向代理是否将files目录的请求正确传递到容器。
  • 查看浏览器控制台的具体错误:打开开发者工具(F12)的网络标签,查看JS/CSS、非图片文件的请求状态码和错误详情,比如是404(路径错误)、403(权限不足)还是CORS拦截。
  • 检查容器内的Apache日志:执行docker logs my_drupal,查看容器内的访问日志和错误日志,确认资源请求是否到达容器,以及是否存在容器内的报错信息。
  • 确认Host头传递是否正确:在settings.php中添加error_log($_SERVER['HTTP_HOST']);,然后查看容器日志,确认Drupal获取到的Host是否为mysite.com,确保ProxyPreserveHost on配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:20:19