WordPress基于Apache+Varnish架构下HTTP跳转HTTPS失效问题求助
问题排查与修复方案
1. 修复VCL配置的语法与逻辑缺陷
你当前的VCL配置存在两处核心问题:vcl_recv 子程序未闭合大括号,且未向Apache传递客户端请求的协议头,导致后端无法正确判断请求是否为HTTPS。
直接替换为以下完整VCL配置:
vcl 4.0; backend default { .host = "127.0.0.1"; .port = "8181"; } sub vcl_recv { # 传递请求协议头给Apache if (req.http.X-Forwarded-Proto !~ "^https?$") { set req.http.X-Forwarded-Proto = "http"; if (req.http.HTTPS == "on") { set req.http.X-Forwarded-Proto = "https"; } } # 后台、登录页跳过缓存 if (req.url ~ "wp-admin|wp-login") { return (pass); } } sub vcl_backend_response { # 保留原有逻辑即可 } sub vcl_deliver { # 保留原有逻辑即可 }
修改完成后执行 varnishd -C -f /etc/varnish/default.vcl 校验语法,确认无报错后重载Varnish服务。
2. 修复wp-config.php逻辑冲突
你当前wp-config中的HTTPS赋值逻辑存在重复定义问题,直接替换为以下内容即可:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { $_SERVER['HTTPS'] = 'on'; $_SERVER['SERVER_PORT'] = 443; } define( 'WP_HOME', 'https://example.com' ); define( 'WP_SITEURL', 'https://example.com' );
3. 优化.htaccess跳转规则
调整跳转判断逻辑避免循环,确保跳转规则放在WordPress默认规则之前,完整配置如下:
SetEnvIf X-Forwarded-Proto "https" HTTPS=on Header append Vary: X-Forwarded-Proto <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC] RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
确认Apache已启用rewrite、headers、setenvif模块,可执行a2enmod rewrite headers setenvif开启后重载Apache服务。
4. 生效验证
- 清空Varnish缓存:
varnishadm ban req.url "~" / - 清空本地浏览器缓存,或用curl命令测试:
curl -I http://example.com,确认返回301跳转至HTTPS地址,无循环跳转问题,HTTPS地址访问正常。
内容的提问来源于stack exchange,提问作者Rahul Biswas
相关产品推荐
相关产品推荐

