window.location='{$current_name}';");
exit();
}
// 重置临时链接参数
if (!empty($_REQUEST["action"]) && $_REQUEST["action"] == "delUrlArgs") {
$check_name = strip_tags($_REQUEST['check_name']);
$dir = dirname(__FILE__) . '/args';
$files = glob($dir . '/' . $check_name . "_*.txt");
foreach ($files as $file) {
if (preg_match('/_(\d{10})\.txt$/', $file, $m)) {
unlink($file);
}
}
header('Location: ' . $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?action=edit_config&name=' . urlencode($check_name));
exit;
}
// 确定当前配置上下文(供表单回显用)
$isNewConfigDraft = false;
$configCopySource = '';
$copyFrom = dash_sanitize_config_name($_REQUEST['copy_from'] ?? '');
if (!empty($_REQUEST["name"])) {
$check_name = trim($_REQUEST["name"]);
$config_name = str_replace(".php", "", $check_name);
$config_file = "check_config/" . $config_name . "_config.php";
if (!file_exists($config_file)) {
$isNewConfigDraft = true;
$sourceFile = ($copyFrom !== '') ? "check_config/{$copyFrom}_config.php" : '';
if ($copyFrom !== '' && is_file($sourceFile)) {
$config_file = $sourceFile;
$configCopySource = $copyFrom;
if ($check_name === 'new_config' || $check_name === '') {
$check_name = dash_suggest_copy_config_name($copyFrom);
}
} else {
$config_file = "check_config/index_config.php";
}
}
} else {
$check_name = "index";
$config_file = "check_config/index_config.php";
}
include($config_file);
// 密码处理
if (!empty($_REQUEST['password'])) {
$_SESSION['password'] = $_REQUEST['password'];
$_SESSION["myaction"] = $_REQUEST['myaction'];
}
// 设置测试访问状态(写入完整 Session 判定缓存,便于测试广告落地链接直达真实页)
if (!empty($_REQUEST["action"]) && $_REQUEST["action"] == "setuvi") {
require_once __DIR__ . '/lib/Cloak/VisitorRepository.php';
if (!empty($_REQUEST["res"]) && $_REQUEST["res"] == "true") {
cloak_session_mark_real_visitor();
}
if (!empty($_REQUEST["res"]) && $_REQUEST["res"] == "false") {
cloak_session_clear_real_visitor();
}
echo("");
exit();
}
// 保存配置
if (!empty($_REQUEST["action"]) && $_REQUEST["action"] == "submit") {
$check_name = trim($_REQUEST["check_name"]);
$methods = trim($_REQUEST["methods"]);
$country_on = in_array(strtoupper(trim($_REQUEST['country_on'] ?? '')), ['ON']) ? 'ON' : 'OFF';
$country_raw = $country_on === 'ON' ? (string) ($_REQUEST['country'] ?? '') : '';
$country = $country_on === 'ON' ? CountryAllowlist::formatForConfig($country_raw) : '';
$blacklist_group_id = (int)($_REQUEST["blacklist_group_id"] ?? 0);
$whitelist_group_id = (int)($_REQUEST["whitelist_group_id"] ?? 0);
try {
$pdoDash = new PDO(
'mysql:host=127.0.0.1;dbname=' . DB_NAME . ';charset=utf8mb4',
DB_USERNAME, DB_PASSWORD,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$chk = $pdoDash->prepare('SELECT 1 FROM ip_groups WHERE id = ? AND type = ? LIMIT 1');
if ($blacklist_group_id > 0) {
$chk->execute([$blacklist_group_id, 'black']);
if (!$chk->fetchColumn()) $blacklist_group_id = 0;
}
if ($whitelist_group_id > 0) {
$chk->execute([$whitelist_group_id, 'white']);
if (!$chk->fetchColumn()) $whitelist_group_id = 0;
}
} catch (Throwable $e) {
$blacklist_group_id = $whitelist_group_id = 0;
}
$DB_fp = $_REQUEST["DB_fp"];
$DB_zp = trim($_REQUEST["DB_zp"]);
$redirect_method = trim($_REQUEST["redirect_method"]);
$show_content = trim($_REQUEST["show_content"]);
$costm_ip_score = trim($_REQUEST["costm_ip_score"]);
$write_log = trim($_REQUEST["write_log"]);
$zh_on = trim($_REQUEST["zh_on"]);
$os_on = trim($_REQUEST["os_on"]);
$mobile_on = trim($_REQUEST["mobile_on"]);
$v_referer = trim($_REQUEST["v_referer"]);
$is_virtual = trim($_REQUEST["is_virtual"]);
$auto_black = trim($_REQUEST["auto_black"]);
$auto_black_times = trim($_REQUEST["auto_black_times"]);
$white_params = trim($_REQUEST["white_params"]);
$keep_params = trim($_REQUEST["keep_params"]);
$iphone_model = $_REQUEST["iphone_model"];
$risk_number = $_REQUEST["risk_number"];
$risk_enhanced = in_array(strtoupper(trim($_REQUEST["risk_enhanced"] ?? '')), ['ON']) ? 'ON' : 'OFF';
$url_args_timeout = $_REQUEST["url_args_timeout"];
$debug_mode = in_array(strtoupper(trim($_REQUEST["debug_mode"] ?? '')), ['ON']) ? 'ON' : 'OFF';
$ad_fb = in_array(strtoupper(trim($_REQUEST["ad_fb"] ?? '')), ['ON']) ? 'ON' : 'OFF';
$ad_google = in_array(strtoupper(trim($_REQUEST["ad_google"] ?? '')), ['ON']) ? 'ON' : 'OFF';
$ad_tiktok = in_array(strtoupper(trim($_REQUEST["ad_tiktok"] ?? '')), ['ON']) ? 'ON' : 'OFF';
$ad_strict = in_array(strtoupper(trim($_REQUEST["ad_strict"] ?? '')), ['ON']) ? 'ON' : 'OFF';
$config_name_submit = str_replace('.php', '', $check_name);
$existing_spm_id = '';
$existing_cfg = 'check_config/' . $config_name_submit . '_config.php';
if (file_exists($existing_cfg)) {
$existing_raw = file_get_contents($existing_cfg);
if (preg_match("/define\('CLOAK_AD_SPM_ID',\s*'([^']*)'\)/", $existing_raw, $spmM)) {
$existing_spm_id = $spmM[1];
}
}
$ad_spm_id = CloakAdSourceGuard::isValidSpmId($existing_spm_id) ? $existing_spm_id : '';
if (($ad_fb === 'ON' || $ad_google === 'ON' || $ad_tiktok === 'ON') && $ad_spm_id === '') {
$ad_spm_id = CloakAdSourceGuard::generateSpmId();
}
if (strtoupper($auto_black) === 'ON' && $blacklist_group_id <= 0) {
echo "";
exit();
}
if ($country_on === 'ON' && $country === '') {
echo "";
exit();
}
if (!empty($methods)) {
ConfigWriter::save($check_name, [
'methods' => $methods,
'blacklist_group_id' => $blacklist_group_id,
'whitelist_group_id' => $whitelist_group_id,
'country' => $country,
'show_content' => $show_content,
'DB_fp' => $DB_fp,
'costm_ip_score' => $costm_ip_score,
'auto_black' => $auto_black,
'is_virtual' => $is_virtual,
'auto_black_times' => $auto_black_times,
'white_params' => $white_params,
'iphone_model' => $iphone_model,
'write_log' => $write_log,
'zh_on' => $zh_on,
'os_on' => $os_on,
'keep_params' => $keep_params,
'redirect_method' => $redirect_method,
'DB_zp' => $DB_zp,
'mobile_on' => $mobile_on,
'v_referer' => $v_referer,
'risk_number' => $risk_number,
'risk_enhanced' => $risk_enhanced,
'url_args_timeout' => $url_args_timeout,
'debug_mode' => $debug_mode,
'ad_fb' => $ad_fb,
'ad_google' => $ad_google,
'ad_tiktok' => $ad_tiktok,
'ad_strict' => $ad_strict,
'ad_spm_id' => $ad_spm_id,
]);
try {
$pdoBind = DomainRepository::pdo();
DomainRepository::ensureTable($pdoBind);
$siteDomainRaw = $_REQUEST['site_domain_id'] ?? '0';
if ($siteDomainRaw === 'random') {
$existingId = DomainRepository::domainIdForConfig($pdoBind, $check_name);
if ($existingId > 0) {
$siteDomainId = $existingId;
} else {
$siteDomainId = DomainRepository::pickRandomDomainId($pdoBind);
}
} else {
$siteDomainId = (int) $siteDomainRaw;
}
if ($siteDomainId > 0) {
DomainRepository::bindConfigToDomain($pdoBind, $check_name, $siteDomainId);
} else {
DomainRepository::clearConfigBinding($pdoBind, $check_name);
}
} catch (Throwable $e) {
}
echo("");
exit();
}
}
function write_file($file_name, $text_str) {
$f = fopen($file_name, "w");
rewind($f);
fwrite($f, $text_str);
fclose($f);
}
function onoff_radio($name, $val, $label_on='开启', $label_off='关闭') {
$on = ($val == 'ON') ? 'active' : '';
$off = ($val != 'ON') ? 'active' : '';
return '
';
}
function dash_truncate_attr($text, $maxLen = 52) {
$text = (string) $text;
$esc = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
if (function_exists('mb_strlen') && function_exists('mb_substr')) {
if (mb_strlen($text, 'UTF-8') <= $maxLen) {
return $esc;
}
return '' . htmlspecialchars(mb_substr($text, 0, $maxLen, 'UTF-8'), ENT_QUOTES, 'UTF-8') . '…';
}
if (strlen($text) <= $maxLen) {
return $esc;
}
return '' . htmlspecialchars(substr($text, 0, $maxLen), ENT_QUOTES, 'UTF-8') . '…';
}
?>
IPCLOAKAPI 多功能管理后台面板 v8.2.1
IPCLOAKAPI 多功能管理后台面板 v8.2.1
alert('密码错误!');window.location='{$current_name}';");
exit();
}
// 站点域名管理
$cloakDomainMsg = '';
$cloakDomainErr = '';
$cloakCfEnabled = CloudflareConfig::isEnabled();
if (!empty($_REQUEST['action']) && $_REQUEST['action'] === 'add_domain') {
$hostText = trim((string) ($_POST['new_hostnames'] ?? $_POST['new_hostname'] ?? ''));
if ($hostText !== '') {
try {
$pdoDom = DomainRepository::pdo();
$dnsMode = $_POST['dns_mode'] ?? 'auto';
if (!in_array($dnsMode, ['auto', 'manual'], true)) {
$dnsMode = 'auto';
}
if ($dnsMode === 'auto' && !$cloakCfEnabled) {
$cloakDomainErr = '自动模式需要先在 cong.php 配置 Cloudflare API Token 与 Account ID,或改选手动模式。';
} else {
$res = DomainProvisioningService::provisionBatch($pdoDom, $hostText, $dnsMode);
if ($res['ok']) {
$addedNames = array_map(static function ($row) {
return $row['hostname'] ?? '';
}, $res['added'] ?? []);
$addedNames = array_filter($addedNames);
$cloakDomainMsg = '已成功添加 ' . count($addedNames) . ' 个域名:'
. htmlspecialchars(implode('、', $addedNames));
if (($res['dns_mode'] ?? '') === 'auto' && $cloakCfEnabled) {
$cloakDomainMsg .= '。请到注册商修改 Nameserver 后,在列表中点击「检测/刷新」。';
} elseif (($res['dns_mode'] ?? '') === 'manual') {
$cloakDomainMsg .= '(手动解析模式,无需 Cloudflare 检测)。';
} else {
$cloakDomainMsg .= ',请在编辑配置时关联此域名。';
}
if (!empty($res['failed'])) {
$failParts = [];
foreach ($res['failed'] as $f) {
$failParts[] = ($f['hostname'] ?? '?') . '(' . ($f['error'] ?? '失败') . ')';
}
$cloakDomainErr = count($res['failed']) . ' 个域名添加失败:'
. htmlspecialchars(implode(';', $failParts));
}
} else {
$cloakDomainErr = $res['error'] ?? '添加失败';
if (!empty($res['failed'])) {
$failParts = [];
foreach ($res['failed'] as $f) {
$failParts[] = ($f['hostname'] ?? '?') . '(' . ($f['error'] ?? '失败') . ')';
}
$cloakDomainErr .= ':' . htmlspecialchars(implode(';', $failParts));
}
}
}
} catch (Throwable $e) {
$cloakDomainErr = $e->getMessage();
}
} else {
$cloakDomainErr = '请至少输入一个域名';
}
}
if (!empty($_REQUEST['action']) && $_REQUEST['action'] === 'check_domain') {
$domainId = (int) ($_POST['domain_id'] ?? $_REQUEST['domain_id'] ?? 0);
$jsonOut = isset($_REQUEST['format']) && $_REQUEST['format'] === 'json';
try {
$res = DomainProvisioningService::checkAndProvision(DomainRepository::pdo(), $domainId);
if ($jsonOut) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode($res, JSON_UNESCAPED_UNICODE);
exit;
}
if ($res['ok']) {
$cloakDomainMsg = $res['message'] ?? '检测完成';
} else {
$cloakDomainErr = $res['message'] ?? '检测失败';
}
} catch (Throwable $e) {
if ($jsonOut) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['ok' => false, 'message' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
exit;
}
$cloakDomainErr = $e->getMessage();
}
}
if (!empty($_REQUEST['action']) && $_REQUEST['action'] === 'delete_domain' && !empty($_REQUEST['domain_id'])) {
try {
$res = DomainProvisioningService::deleteWithCloudflare(DomainRepository::pdo(), (int) $_REQUEST['domain_id']);
if ($res['ok']) {
$cloakDomainMsg = $res['message'] ?? '域名已删除。';
if (!empty($res['warning'])) {
$cloakDomainErr = $res['warning'];
}
} else {
$cloakDomainErr = $res['message'] ?? '删除失败';
}
} catch (Throwable $e) {
$cloakDomainErr = $e->getMessage();
}
}
// 系统状态检测(列表页用)
function dash_check_mysql() {
try {
$pdo = new PDO('mysql:host=127.0.0.1;dbname=' . DB_NAME . ';charset=utf8mb4', DB_USERNAME, DB_PASSWORD, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
return true;
} catch (Throwable $e) { return false; }
}
function dash_check_redis() {
if (!extension_loaded('redis') || strtoupper(REDIS_ENABLED) !== 'ON') return null;
try {
$r = new Redis();
if (!@$r->connect(REDIS_HOST, (int)REDIS_PORT, 0.5)) return false;
$r->ping();
return true;
} catch (Throwable $e) { return false; }
}
function dash_sanitize_config_name($name)
{
$name = trim(str_replace('.php', '', (string) $name));
if ($name === '' || !preg_match('/^[a-zA-Z0-9_-]+$/', $name)) {
return '';
}
return $name;
}
function dash_suggest_copy_config_name($source)
{
$source = dash_sanitize_config_name($source);
if ($source === '') {
return 'new_config';
}
$base = $source . '_copy';
$candidate = $base;
$suffix = 2;
while (file_exists(__DIR__ . "/check_config/{$candidate}_config.php")) {
$candidate = $base . $suffix;
$suffix++;
}
return $candidate;
}
function dash_cfg_get($raw, $name)
{
if (preg_match("/define\('" . preg_quote($name, '/') . "',\s*'([^']*)'\)/", $raw, $m)) {
return $m[1];
}
return '';
}
function dash_build_ad_links($pf, $protocol, $host)
{
$path = __DIR__ . "/check_config/{$pf}_config.php";
try {
$pdoDashHost = DomainRepository::pdo();
DomainRepository::ensureTable($pdoDashHost);
$bound = DomainRepository::primaryHostnameForConfig($pdoDashHost, $pf);
if ($bound !== '') {
$host = $bound;
}
} catch (Throwable $e) {
}
$host = DomainRepository::normalizeHostname($host);
if ($host === '') {
$host = DomainRepository::normalizeHostname($_SERVER['HTTP_HOST'] ?? '');
}
$base = rtrim($protocol . $host, '/') . '/' . (($pf != 'index') ? $pf : '');
if (!file_exists($path)) {
return [['label' => '落地链接', 'url' => $base]];
}
$raw = file_get_contents($path);
$enabled = [];
if (dash_cfg_get($raw, 'CLOAK_AD_FB') === 'ON') {
$enabled[] = CloakAdSourceGuard::PLATFORM_FB;
}
if (dash_cfg_get($raw, 'CLOAK_AD_GOOGLE') === 'ON') {
$enabled[] = CloakAdSourceGuard::PLATFORM_GOOGLE;
}
if (dash_cfg_get($raw, 'CLOAK_AD_TIKTOK') === 'ON') {
$enabled[] = CloakAdSourceGuard::PLATFORM_TIKTOK;
}
if (empty($enabled)) {
return [['label' => '落地链接', 'url' => $base]];
}
$spmId = dash_cfg_get($raw, 'CLOAK_AD_SPM_ID');
$fpUrls = [];
if (preg_match("/define\('DB_FP',\s*(array\s*\(.*?\))\s*\)/s", $raw, $fpMatch)) {
@eval('$fpUrls = ' . $fpMatch[1] . ';');
}
$query = CloakAdSourceGuard::buildAdLinkQuery($enabled, $spmId, $fpUrls);
$url = $base . ($query !== '' ? '?' . $query : '');
return [['label' => '落地链接', 'url' => $url]];
}
function dash_build_config_index()
{
$items = [];
$dir = __DIR__ . '/check_config';
$dh = @opendir($dir);
if (!$dh) {
return $items;
}
while (false !== ($f = readdir($dh))) {
if ($f === '.' || $f === '..') {
continue;
}
$path = $dir . '/' . $f;
if (is_dir($path) || $f === 'index.php' || $f === 'a.txt') {
continue;
}
if (substr($f, -11) !== '_config.php') {
continue;
}
$name = str_replace('_config.php', '', $f);
if ($name === '' || !preg_match('/^[a-zA-Z0-9_-]+$/', $name)) {
continue;
}
$entryPhp = __DIR__ . '/' . $name . '.php';
if (!file_exists($entryPhp)) {
copy(__DIR__ . '/tem_link.php', $entryPhp);
}
$items[] = [
'name' => $name,
'mtime' => (int) @filemtime($path),
'path' => $path,
];
}
closedir($dh);
usort($items, function ($a, $b) {
if ($a['mtime'] === $b['mtime']) {
return strcmp($a['name'], $b['name']);
}
return $b['mtime'] <=> $a['mtime'];
});
return $items;
}
function dash_paginate_configs(array $all, $q, $page, $perPage)
{
$q = trim((string) $q);
$page = max(1, (int) $page);
$perPage = max(1, (int) $perPage);
if ($q !== '') {
$qLower = function_exists('mb_strtolower') ? mb_strtolower($q, 'UTF-8') : strtolower($q);
$all = array_values(array_filter($all, function ($row) use ($qLower) {
$name = (string) ($row['name'] ?? '');
$hay = function_exists('mb_strtolower') ? mb_strtolower($name, 'UTF-8') : strtolower($name);
return strpos($hay, $qLower) !== false;
}));
}
$total = count($all);
$totalPages = $total > 0 ? (int) ceil($total / $perPage) : 1;
if ($page > $totalPages) {
$page = $totalPages;
}
$offset = ($page - 1) * $perPage;
return [
'items' => array_slice($all, $offset, $perPage),
'total' => $total,
'page' => $page,
'per_page' => $perPage,
'total_pages' => $totalPages,
];
}
function dash_delete_config($name)
{
$name = dash_sanitize_config_name($name);
if ($name === '' || $name === 'index') {
return false;
}
try {
DomainRepository::clearConfigBinding(DomainRepository::pdo(), $name);
} catch (Throwable $e) {
}
@unlink(__DIR__ . "/check_config/{$name}_config.php");
@unlink(__DIR__ . "/{$name}.php");
return true;
}
function dash_list_query_params($q, $page)
{
$params = [];
if (trim((string) $q) !== '') {
$params['q'] = trim((string) $q);
}
if ((int) $page > 1) {
$params['page'] = (int) $page;
}
return $params;
}
function dash_list_url($currentName, $q, $page)
{
$params = dash_list_query_params($q, $page);
$qs = $params !== [] ? '?' . http_build_query($params) : '';
return $currentName . $qs;
}
// 配置列表索引(按文件修改时间倒序)
$configListAll = dash_build_config_index();
$listSearchQ = trim((string) ($_GET['q'] ?? ''));
$listPage = max(1, (int) ($_GET['page'] ?? 1));
$listPerPage = 10;
$configPage = dash_paginate_configs($configListAll, $listSearchQ, $listPage, $listPerPage);
$products_file_ary = array_map(function ($row) {
return $row['name'];
}, $configListAll);
// 删除 / 批量删除配置
if (!empty($_REQUEST["action"]) && $_REQUEST["action"] == "delete_config" && !empty($_REQUEST["name"])) {
$name = trim($_REQUEST["name"]);
if ($name == "index") {
echo("");
exit();
}
dash_delete_config($name);
echo("");
exit();
}
if (!empty($_REQUEST['action']) && $_REQUEST['action'] === 'batch_delete_config') {
$names = $_REQUEST['names'] ?? [];
if (!is_array($names)) {
$names = [$names];
}
$deleted = 0;
$seen = [];
foreach ($names as $rawName) {
$name = dash_sanitize_config_name($rawName);
if ($name === '' || $name === 'index' || isset($seen[$name])) {
continue;
}
$seen[$name] = true;
if (dash_delete_config($name)) {
$deleted++;
}
}
$redirect = dash_list_url($current_name, $_POST['q'] ?? '', 1);
$msg = $deleted > 0 ? "已删除 {$deleted} 个配置" : '未删除任何配置';
echo("");
exit();
}
// 加载 IP 组(编辑页用)
$blackGroups = $whiteGroups = [];
try {
$pdoDash = new PDO('mysql:host=127.0.0.1;dbname=' . DB_NAME . ';charset=utf8mb4', DB_USERNAME, DB_PASSWORD, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
$stb = $pdoDash->prepare("SELECT id, name FROM ip_groups WHERE type = 'black' ORDER BY id ASC");
$stb->execute(); $blackGroups = $stb->fetchAll();
$stw = $pdoDash->prepare("SELECT id, name FROM ip_groups WHERE type = 'white' ORDER BY id ASC");
$stw->execute(); $whiteGroups = $stw->fetchAll();
} catch (Throwable $e) {}
$currentBlacklistGroupId = defined('BLACKLIST_GROUP_ID') ? (int)BLACKLIST_GROUP_ID : 0;
$currentWhitelistGroupId = defined('WHITELIST_GROUP_ID') ? (int)WHITELIST_GROUP_ID : 0;
$action = $_REQUEST['action'] ?? '';
$isEdit = in_array($action, ['edit_config', 'submit'], true);
$cloakSiteDomains = [];
$domainConfigMap = [];
$selectedDomainId = 0;
$dashboardDefaultHost = DomainRepository::normalizeHostname($_SERVER['HTTP_HOST'] ?? '');
try {
$pdoDash = $pdoDash ?? DomainRepository::pdo();
DomainRepository::ensureTable($pdoDash);
$cloakSiteDomains = DomainRepository::listAll($pdoDash);
$domainConfigMap = DomainRepository::groupConfigsByDomainId($pdoDash);
if ($isEdit) {
$selectedDomainId = DomainRepository::domainIdForConfig($pdoDash, $check_name);
}
} catch (Throwable $e) {
$cloakSiteDomains = [];
$domainConfigMap = [];
}
// 视图判断
$_d = function($name, $default) { return defined($name) ? constant($name) : $default; };
?>
IPCLOAKAPI 多功能管理后台面板 v8.2.1
配置管理
管理 Cloak 配置、广告落地链接与站点域名
● MySQL ' . ($mysqlOk ? '已连接' : '连接失败') . '';
if ($redisOk === null) {
echo '● Redis 未启用';
} else {
echo '● Redis ' . ($redisOk ? '已连接' : '连接失败') . '';
}
?>
● 配置数:(搜索「」)
● 已登记域名:
Cloudflare 已启用:选择「自动」时将创建 Zone 并配置 DNS/SSL;选择「手动」时仅本地登记(您已自行配置 DNS)。
源站仍需在宝塔添加站点并监听 。
提示:自动模式需先在 cong.php 配置 Cloudflare API Token 与 Account ID。若已自行完成 DNS 解析,请选择「手动」模式。
使用前请先在宝塔添加站点并开启 SSL。
尚未添加域名。未添加时,广告链接将使用当前后台访问域名:
| 域名 |
关联配置 |
Cloudflare | Nameserver |
操作 |
|
未关联';
} else {
foreach ($boundConfigs as $cfgName) {
echo '' . htmlspecialchars($cfgName) . '';
}
}
?> |
|
—
|
|
← 返回配置列表