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配置中添加:
确保HTML中的资源路径被正确替换为HTTPS地址。ProxyHTMLEnable On ProxyHTMLURLMap http://localhost:8006/ https://mysite.com/ - 检查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
相关产品推荐
相关产品推荐

