WordPress Docker容器HTTPS下静态文件无法加载问题求助
这问题我之前帮朋友排查过几乎一模一样的情况,核心原因很明确:你的WordPress容器内部还在以HTTP协议生成静态资源的链接,虽然Apache的80→443重定向对单独的静态资源请求有效,但浏览器加载HTTPS页面时,会直接拦截页面里的HTTP资源请求(现代浏览器的混合内容安全策略),根本不会触发重定向。
下面是具体的解决步骤,按顺序操作就能搞定:
1. 给WordPress容器强制设置HTTPS站点地址
在你的docker-compose.yml里,给wordpress服务的environment添加两个关键变量,直接指定WP的站点和首页URL为HTTPS:
wordpress: # 其他配置不变... environment: WORDPRESS_DB_HOST: wpdb:3306 WORDPRESS_DB_USER: wordpres_admin WORDPRESS_DB_PASSWORD: pass # 新增以下两行 WORDPRESS_SITEURL: https://example.com WORDPRESS_HOME: https://example.com
修改后重启容器:docker-compose up -d
2. 让Apache告诉WordPress当前是HTTPS请求
在你的443端口VirtualHost配置里,添加请求头传递,让WP知道前端是通过HTTPS访问的:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName example.com ProxyPreserveHost On # 新增以下两行 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" ProxyPass / http://172.20.0.100/ ProxyPassReverse / http://172.20.0.100/ SSLEngine on SSLCertificateFile /fullchain.pem SSLCertificateKeyFile /privkey.pem </VirtualHost> </IfModule>
然后启用mod_headers模块并重启Apache:
a2enmod headers systemctl restart apache2
这一步是关键——WP默认会根据容器内部的协议(HTTP)生成链接,通过传递X-Forwarded-Proto头,能让WP识别到外部是HTTPS请求,从而生成正确的HTTPS资源链接。
3. 兜底:修改wp-config.php强制HTTPS(可选)
如果前两步还没解决,可以进入WordPress容器修改wp-config.php,添加以下代码确保WP强制使用HTTPS:
# 进入容器 docker exec -it [你的wordpress容器名] bash # 编辑wp-config.php(用vi或者nano) nano /var/www/html/wp-config.php
添加内容:
// 识别反向代理的HTTPS请求 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; } // 强制后台使用HTTPS define('FORCE_SSL_ADMIN', true);
保存后退出容器,刷新页面就能看到静态资源正常加载了。
补充说明为什么单独访问静态资源有效
当你直接访问http://example.com/wp-admin/css/install.min.css?ver=5.2.2时,这是一个独立的HTTP请求,Apache的重定向规则会把它转到HTTPS,浏览器会正常处理这个跳转;但当HTTPS页面里嵌入HTTP资源链接时,浏览器的混合内容安全策略会直接阻止加载,不会触发重定向——这就是你看到的矛盾现象的原因。
内容的提问来源于stack exchange,提问作者Andrei Krestyan

