# [メタ情報] # 識別子: マイライブラリXserverのrdphp_exe # システム名: マイライブラリXserverのrd.php # 技術種別: Misc # 機能名: Misc # 使用言語: php # 状態: 実行用 # [/メタ情報] 要約:このPHPスクリプトは、id パラメータから適切なメディアURLを取得し、テキスト系ファイルはUTF-8で中継出力、それ以外はURLへリダイレクトする統合ルータ機能を持つ。まず、候補パスから最初に読める dropbox_wp_library.json を読み込み、wpidex が一致するレコードを拡張子差や大文字小文字の違いを吸収しながら検索する。サーバー種別は column_M を最優先し、Dropbox・Synology・Xserver・pCloud のいずれを使うか決定する。pCloudの場合は pcloud_library.json の direct_url を最優先し、見つからない場合は従来のパス変換で補完する。他サーバーではキャッシュ回避用の v パラメータを自動付与するが、pCloudには付与しない。txt/vtt/srt は取得後UTF-8へ変換し、改行統一やContent-Type設定を行って直接返す。画像・動画等は最終URLへ302リダイレクトする。診断モード(?diag=1)では内部状態をtext/plainで表示する。 Xserver WordPressサーバー rd.php /xxxxxxxx.com/public_html/ = 1 && $column_M <= 4) { $server_type = $column_M; // ★ ファイル別が最優先 } elseif ($select_no >= 1 && $select_no <= 4) { $server_type = $select_no; // 次に拡張子デフォルト } else { $server_type = 1; // 最後の保険:Dropbox } // ベースURL選択 $url = ''; $pcloud_source = ''; // diag 用: 'direct' or 'fallback' // ① Dropbox if ($server_type === 1) { $url = $target['dropboxlink_url'] ?? ''; // ② Synology } elseif ($server_type === 2) { $base = $target['wp_encoded_url'] ?? ''; if ($base !== '') { $url = str_replace("https://xxxxxxxx.com", "https://xxxxxxxx.synology.me", $base); } // ③ Xserver } elseif ($server_type === 3) { $url = $target['wp_encoded_url'] ?? ''; // ④ pCloud } elseif ($server_type === 4) { // まず pcloud_library.json から direct_url を探す $pcloud_direct = loadPcloudDirectUrl($target['wpidex'] ?? ''); if ($pcloud_direct) { $url = $pcloud_direct; $pcloud_source = 'direct'; } else { // direct_url が見つからない場合は、従来どおりパス変換でフォールバック $url = generatePcloudUrl($target['wp_pathlink_url'] ?? ''); $pcloud_source = 'fallback'; } } // どのルートでもURLが空ならエラー if ($url === '' || $url === null) { if ($diag) { echo "ERR: url empty\n"; echo "server_type: {$server_type}\n"; } http_response_code(500); exit; } // 拡張子判定 $path_only = (string)parse_url($url, PHP_URL_PATH); $ext = strtolower(pathinfo($path_only, PATHINFO_EXTENSION)); // pCloud判定(server_type=4 または host が filedn.eu) $is_pcloud = ($server_type === 4) || (strpos($url, 'https://filedn.eu/') === 0); // ---- v パラメータ ---- // pCloud は v を付けない(直リンクのみ) $base_ver = (int)@filemtime($json_path_used); $server_code = (int)$server_type; $path_crc = sprintf('%u', crc32($path_only)); $path_tail3 = substr($path_crc, -3); $ver = (string)$base_ver . (string)$server_code . (string)$path_tail3; // pCloud 以外は v= を付与 $url_with_v = $is_pcloud ? $url : addOrReplaceQueryVar($url, 'v', $ver); // ───────────────────────── テキスト系は中継出力 ───────────────────────── if (in_array($ext, ['txt', 'vtt', 'srt'], true)) { $raw = fetchRemote($url_with_v); if ($raw === null) { if ($diag) echo "ERR: fetch fail for text proxy\n"; http_response_code(502); exit; } $enc = mb_detect_encoding($raw, ['UTF-8', 'SJIS-win', 'CP932', 'SJIS', 'EUC-JP', 'ISO-2022-JP', 'ASCII'], true); if ($enc && strtoupper($enc) !== 'UTF-8') { $raw = mb_convert_encoding($raw, 'UTF-8', $enc); } $raw = preg_replace("/\r\n|\r/u", "\n", $raw); $ctype = ($ext === 'vtt') ? 'text/vtt' : 'text/plain'; header("Content-Type: {$ctype}; charset=UTF-8"); header("X-Content-Type-Options: nosniff"); $fname = basename($path_only); if ($fname === '') $fname = ($id_norm !== '' ? $id_norm : 'file') . '.' . $ext; header('Content-Disposition: inline; filename="' . $fname . '"'); while (ob_get_level()) { ob_end_clean(); } echo $raw; exit; } // ───────────────────────── それ以外はリダイレクト ───────────────────────── if ($diag) { echo "id(raw): {$id}\n"; echo "id(norm): {$id_norm}\n"; echo "wpidex: {$target['wpidex']}\n"; echo "column_M: {$column_M}\n"; echo "select_no: {$select_no}\n"; echo "server_type: {$server_type}\n"; echo "url(base): {$url}\n"; echo "ext: {$ext}\n"; echo "json_path: {$json_path_used}\n"; echo "json_mtime: {$base_ver}\n"; echo "server_code: {$server_code}\n"; echo "path_tail3: {$path_tail3}\n"; echo "is_pcloud: " . ($is_pcloud ? '1' : '0') . "\n"; echo "pcloud_src: {$pcloud_source}\n"; echo "url_with_v: {$url_with_v}\n"; echo "mode: redirect\n"; echo "OK\n"; exit; } header("Location: " . $url_with_v, true, 302); exit; // ====================================================================== // helpers // ====================================================================== /** * 最初に読めた JSON (dropbox_wp_library) を返す */ function loadFirstAvailableJson(array $paths) { foreach ($paths as $p) { $raw = @file_get_contents($p); if ($raw !== false && $raw !== '') { return [$raw, $p]; } } return [null, null]; } /** * pcloud_library.json から wpidex に対応する direct_url を取得 * 見つからなければ null を返す */ function loadPcloudDirectUrl($wpidex) { $wpidex = (string)$wpidex; if ($wpidex === '') return null; static $cache = null; if ($cache === null) { $path = PCLOUD_JSON_PATH; if (!is_readable($path)) { return null; } $raw = @file_get_contents($path); if ($raw === false || $raw === '') { return null; } $arr = json_decode($raw, true); if (!is_array($arr)) { return null; } $map = []; foreach ($arr as $row) { if (!isset($row['wpidex'], $row['direct_url'])) continue; $k = (string)$row['wpidex']; $v = trim((string)$row['direct_url']); if ($k !== '' && $v !== '') { $map[$k] = $v; } } $cache = $map; } return $cache[$wpidex] ?? null; } /** * pCloud 用URL生成(フォールバック用) * - wp_pathlink_url(https://xxxxxxxx.com/wp-content/...)はすでにエンコード済み * - 追加の rawurlencode は行わない(二重エンコード防止) */ function generatePcloudUrl($original_url) { $prefix = "https://xxxxxxxx.com/wp-content/"; $pcloud_base = "https://filedn.eu/<あなたのpCloudトークン>/"; if (strpos($original_url, $prefix) === 0) { $relative_encoded = substr($original_url, strlen($prefix)); return $pcloud_base . $relative_encoded; } return ''; } /** * URL のクエリに key=value を追加(既存があれば置換) */ function addOrReplaceQueryVar($url, $key, $value) { $p = parse_url($url); $scheme = $p['scheme'] ?? ''; $host = $p['host'] ?? ''; $port = isset($p['port']) ? ':' . $p['port'] : ''; $path = $p['path'] ?? ''; $fragment = isset($p['fragment']) ? '#'.$p['fragment'] : ''; $query = []; if (!empty($p['query'])) { parse_str($p['query'], $query); } $query[$key] = $value; $qs = http_build_query($query); $auth = ''; if (isset($p['user'])) { $auth = $p['user']; if (isset($p['pass'])) { $auth .= ':' . $p['pass']; } $auth .= '@'; } return ($scheme ? $scheme.'://' : '') . $auth . $host . $port . $path . ($qs ? '?'.$qs : '') . $fragment; } /** * 外部URLを取得(curl 優先、なければ file_get_contents) */ function fetchRemote($url) { if (function_exists('curl_init')) { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => 15, CURLOPT_USERAGENT => 'xxxxxxxx-rd-php/1.0', CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, ]); $data = curl_exec($ch); $err = curl_errno($ch); $code = (int)curl_getinfo($ch, CURLINFO_RESPONSE_CODE); curl_close($ch); if ($err === 0 && $data !== false && $code >= 200 && $code < 400) { return $data; } return null; } $ctx = stream_context_create([ 'http' => [ 'method' => 'GET', 'timeout' => 15, 'header' => "User-Agent: xxxxxxxx-rd-php/1.0\r\n", ], 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, ], ]); $data = @file_get_contents($url, false, $ctx); return ($data !== false) ? $data : null; } ?>