原因(来自chatGPT):
✅ 为什么会无限重定向(301 / 302)?
📌 重点:WordPress 判断当前请求是否是 HTTPS,是靠
$_SERVER['HTTPS']
或$_SERVER['SERVER_PORT'] == 443
。但你的网站结构是这样的:
浏览器(访问 https://joyce09.com)
↓
Cloudflare(加密 HTTPS)
↓
你的服务器(实际接收到的请求是 HTTP)所以 WordPress 的视角是这样的:
$_SERVER['HTTPS'] = null; // 它不知道用户原来是 HTTPS 访问的
这时候你后台设置的是
https://joyce09.com
,WordPress就会:“你访问的是 HTTP?那我重定向你去 HTTPS 吧!”(302 重定向)
➡️ 但 Cloudflare 发来的本来就已经是 HTTPS!于是形成了一个死循环。
✅ 为什么加上这段代码就有用了?
if (
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'
) {
$_SERVER['HTTPS'] = 'on';
}这段代码的作用是:
✅ 利用 Cloudflare 提供的请求头
X-Forwarded-Proto
来判断原始请求是不是 HTTPS。Cloudflare 会自动在请求头里加上:
X-Forwarded-Proto: https
所以上面的 PHP 代码就会告诉 WordPress:
“别担心,虽然你看到的是 HTTP,但我确认用户原始是用 HTTPS 访问的。”
于是 WordPress 就不会继续尝试重定向了,问题自然解决。
因此 这种问题一般只出现在反代/使用了cdn的站点中
可以使用下面两端代码解决,一般第一段就行,第二段是gpt给的,会判断请求头,更智能但没必要,两段都是加在wp-config.php
中require_once ABSPATH . 'wp-settings.php';
的前面(一般是最后一段)
// 强制后台使用 HTTPS 协议访问
define('FORCE_SSL_ADMIN', true);
// 强制登录页(wp-login.php)使用 HTTPS
define('FORCE_SSL_LOGIN', true);
// 告诉 WordPress:当前请求使用的是 HTTPS
$_SERVER['HTTPS'] = 'ON';
// 禁用 JS/CSS 合并(防止后台加载异常)
define('CONCATENATE_SCRIPTS', false);
// 定义 WordPress 的绝对路径常量 ABSPATH,如果尚未定义
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
// 判断是否是通过代理来的 HTTPS 请求(Cloudflare、CDN、反代)
if (
(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') ||
(!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'on')
) {
$_SERVER['HTTPS'] = 'on';
}
// 强制后台和登录走 HTTPS
if (!defined('FORCE_SSL_ADMIN')) {
define('FORCE_SSL_ADMIN', true);
}
define('FORCE_SSL_LOGIN', true);
// 禁用 JS/CSS 合并(防止后台加载异常)
define('CONCATENATE_SCRIPTS', false);