解决国内服务器WordPress无法更新的问题

解决国内服务器WordPress无法更新的问题

WordPress官方对国内访问做了限制,导致有时候无法更新WordPress版本、插件、主题等,更新的时候可能会遇到报错HTTP ERROR 524的情况。

本文通过自定义反代来解决问题,需要Cloudflare账号或国外服务器和域名。

使用Cloudflare Workers

需要有Cloudflare账号并且托管了域名。

1、登录Cloudflare后,在构建 – 计算 – Workers 和 Pages – 创建应用程序。

解决国内服务器WordPress无法更新的问题

2、选择“从Hello World!开始”

解决国内服务器WordPress无法更新的问题

3、部署成功后点进项目后选择“编辑代码”

解决国内服务器WordPress无法更新的问题

4、左侧替换为下面代码后点击“部署”

解决国内服务器WordPress无法更新的问题
const ALLOWED_HOSTS = new Set([
  'api.wordpress.org',
  'downloads.wordpress.org',
  'wordpress.org',
]);

export default {
  async fetch(request) {
    const currentUrl = new URL(request.url);
    const target = currentUrl.searchParams.get('url');

    if (!target) {
      return new Response('未指定 URL', { status: 400 });
    }

    let targetUrl;
    try {
      targetUrl = new URL(target);
    } catch {
      return new Response('URL 无效', { status: 400 });
    }

    if (
      !['http:', 'https:'].includes(targetUrl.protocol) ||
      !ALLOWED_HOSTS.has(targetUrl.hostname.toLowerCase())
    ) {
      return new Response('仅允许代理 WordPress 官方域名', { status: 403 });
    }

    const headers = new Headers(request.headers);
    headers.set('User-Agent', 'WordPress-Cloudflare-Worker-Proxy/1.0');

    headers.delete('host');
    headers.delete('cf-connecting-ip');
    headers.delete('cf-ipcountry');
    headers.delete('cf-ray');
    headers.delete('cf-visitor');
    headers.delete('x-forwarded-for');
    headers.delete('x-forwarded-proto');

    const init = {
      method: request.method,
      headers,
      redirect: 'follow',
    };

    if (!['GET', 'HEAD'].includes(request.method)) {
      init.body = request.body;
    }

    const response = await fetch(targetUrl.toString(), init);

    const responseHeaders = new Headers(response.headers);
    responseHeaders.delete('content-encoding');
    responseHeaders.delete('content-length');
    responseHeaders.delete('transfer-encoding');
    responseHeaders.delete('connection');

    return new Response(response.body, {
      status: response.status,
      statusText: response.statusText,
      headers: responseHeaders,
    });
  },
};

5、因为Cloudflare Workers默认域名国内无法访问,还需要绑定自己已经托管在Cloudflare 的域名。

解决国内服务器WordPress无法更新的问题

6、如果绑定域名后,你的国内服务器访问很慢,可以使用“CloudflareSpeedTest”项目指定hosts IP。

CloudflareSpeedTest:https://github.com/XIU2/CloudflareSpeedTest

按照官方教程操作,选出最优IP后修改服务器hosts即可。

使用自己的服务器

这个稍微简单一些,如果你正好有网站在使用国外服务器,直接使用这个方案。

在任意目录新建一个.PHP文件,代码如下:

<?php
/**
 * WordPress 官方资源代理脚本
 */

$allowedHosts = [
    'api.wordpress.org',
    'downloads.wordpress.org',
    'wordpress.org',
];

if (empty($_GET['url'])) {
    http_response_code(400);
    exit('未指定 URL');
}

$url = trim($_GET['url']);
$parts = parse_url($url);

if (
    empty($parts['scheme']) ||
    empty($parts['host']) ||
    !in_array($parts['scheme'], ['http', 'https'], true) ||
    !in_array(strtolower($parts['host']), $allowedHosts, true)
) {
    http_response_code(403);
    exit('仅允许代理 WordPress 官方域名');
}

$method = $_SERVER['REQUEST_METHOD'] === 'POST' ? 'POST' : 'GET';

$headers = [
    'User-Agent: WordPress-Proxy/1.0',
];

$options = [
    'http' => [
        'method'        => $method,
        'timeout'       => 30,
        'ignore_errors' => true,
        'header'        => implode("\r\n", $headers),
    ],
];

if ($method === 'POST') {
    $body = file_get_contents('php://input');

    $options['http']['header'] .= "\r\nContent-Type: " . (
        $_SERVER['CONTENT_TYPE'] ?? 'application/x-www-form-urlencoded'
    );

    $options['http']['content'] = $body;
}

$context = stream_context_create($options);
$result = @file_get_contents($url, false, $context);

if ($result === false) {
    http_response_code(502);
    exit('代理请求失败');
}

if (!empty($http_response_header)) {
    foreach ($http_response_header as $header) {
        if (stripos($header, 'Transfer-Encoding:') === 0) {
            continue;
        }

        if (stripos($header, 'Connection:') === 0) {
            continue;
        }

        header($header, false);
    }
}

echo $result;

网站加速

两个方案都需要修改需要加速的WordPress的主题function.php文件,在文件最下面添加:

add_filter('pre_http_request', function ($pre, $parsed_args, $url) {
    $host = parse_url($url, PHP_URL_HOST);

    if (!in_array($host, ['api.wordpress.org', 'downloads.wordpress.org'], true)) {
        return $pre;
    }

    $proxy_url = 'https://你的域名/';

    return wp_remote_request($proxy_url . '?url=' . urlencode($url), $parsed_args);
}, 10, 3);

注意需要修改代码中的域名部分,如果是Cloudflare Workers版本直接填写域名,如果是php版本需要精确的到文件,如:https://www.wpzh.net/wp/wp-proxy.php

1、本站所有WordPress主题、插件均由人工测试无误后发布。
2、本站保证代码的完整性和可用性,兼容性可查看主题/插件官网说明。
3、某些插件/主题的个别功能需要验证订阅账户并连接官方服务器,所以破解版是不能使用这个功能的。
4、本站只提供相应的主题、插件代码下载,不包含任何安装或其他服务。(可选本站付费服务)
5、本站汉化主题、插件均为破解版,详细信息请看资源文章说明。
6、开通终身会员后可享受全站无限制下载。
7、本站所有资源均为虚拟资源,所以已经售出,概不退款,还请谅解。

给TA打赏
共{{data.count}}人
人已打赏
wordpress教程

WordPress 速度提升秘籍:如何让你的网页“秒开”

2025-2-14 11:37:14

wordpress插件

Magic SEO v29062023 中文汉化版 | WordPress 自动SEO优化插件

2024-12-10 11:30:10

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索