使用Google托管SSL的Bitnami WordPress混合内容问题求助
1. 先搞定WP对HTTPS请求的识别(核心)
你之前改WP_HOME/SITEURL为HTTPS就崩溃,是因为SSL终止在Google负载均衡器上,服务器本身收的是HTTP请求,WP后端自身调用时会强制用HTTPS连服务器,但服务器没配SSL,自然炸了。解决这个得让WP明确:用户用的是HTTPS,但内部请求仍用HTTP。
第一步,确认Google负载均衡器已经开启X-Forwarded-Proto头的传递——这是关键,不然WP识别不了外部的HTTPS请求。
然后修改wp-config.php,在原来的WP_HOME/SITEURL配置前加这段代码:
// 识别负载均衡器传过来的HTTPS标识 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; $_SERVER['SERVER_PORT'] = 443; } // 现在可以安全地把地址改成HTTPS了 define( 'WP_HOME', 'https://example.com' ); define( 'WP_SITEURL', 'https://example.com' );
这样WP对外生成的链接全是HTTPS,内部请求服务器的时候还是用HTTP,不会崩溃。
2. 修复已上传媒体的HTTP链接
之前传的媒体还是HTTP地址,得批量改掉,两种方法选一个:
方法一:SQL批量替换(最快)
登录Bitnami的MySQL,用命令mysql -u root -p,密码在bitnami_application_password文件里。执行下面的SQL(把example.com换成你的域名):
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://example.com', 'https://example.com'); UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, 'http://example.com', 'https://example.com'); UPDATE wp_posts SET guid = REPLACE(guid, 'http://example.com', 'https://example.com');
⚠️ 执行前一定要备份数据库,别手抖改错了。
方法二:用WP钩子强制转HTTPS(不用碰数据库)
要是不想动数据库,就在wp-config.php末尾加这段代码:
// 强制媒体附件链接转HTTPS add_filter('wp_get_attachment_url', function($url) { return str_replace('http://example.com', 'https://example.com', $url); }); // 处理图片srcset里的HTTP链接 add_filter('wp_calculate_image_srcset', function($sources) { foreach ($sources as &$source) { $source['url'] = str_replace('http://example.com', 'https://example.com', $source['url']); } return $sources; });
3. 可选:强制所有HTTP请求跳转到HTTPS
为了避免用户输入HTTP访问,给Web服务器加跳转规则:
如果你用Apache
编辑/opt/bitnami/apache/conf/vhosts/wordpress-vhost.conf,在<VirtualHost *:80>块里加:
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
然后重启Apache:sudo /opt/bitnami/ctlscript.sh restart apache
如果你用Nginx
编辑/opt/bitnami/nginx/conf/vhosts/wordpress-vhost.conf,在server { listen 80; }块里加:
if ($http_x_forwarded_proto != "https") { return 301 https://$host$request_uri; }
重启Nginx:sudo /opt/bitnami/ctlscript.sh restart nginx
4. 验证修复结果
- 打开网站,查看页面源码里的资源链接是否全为HTTPS
- 上传新图片,检查媒体库的链接是否为HTTPS
- 用浏览器控制台的「安全」面板确认没有混合内容警告
内容的提问来源于stack exchange,提问作者CuppaCoffee

