交換友情鏈接 (回連) 是 SEO 常見手段,但對方可能悄悄移除貴站連結。本工具提供一個完整的 PHP + JavaScript 解決方案,支援:
<a href=...> 連結。iframe + JS 遞迴逐一檢查,避免瀏覽器超時。contenteditable iframe 做視覺編輯器 -> 正則提取連結 -> 產生檢查列表 -> JS 狀態機控制 hidden_iframe 發送檢查請求。check_links.php?mod=check_now 接收目標 URL + 待查連結 -> cURL/file_get_contents 抓取遠端內容 -> stristr 搜尋待查連結 -> 回傳 JS 腳本更新父頁面 DOM 狀態欄。setTimeout 監控,超時標記可重試,自動模式下自動跳過繼續下一個。function my_file_get_contents($url, $timeout = 30) {
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CONNECTTIMEOUT => $timeout,
CURLOPT_FOLLOWLOCATION => true, // 支援重導向
CURLOPT_USERAGENT => 'Mozilla/5.0 (Link Checker Bot)',
CURLOPT_SSL_VERIFYPEER => false, // 簡易處理 HTTPS
]);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
// 回退方案
if (ini_get('allow_url_fopen')) {
$ctx = stream_context_create(['http' => ['timeout' => $timeout]]);
return @file_get_contents($url, false, $ctx);
}
return '';
}
if (isset($_GET['mod']) && $_GET['mod'] === 'check_now') {
$targetUrl = $_GET['url'];
$myUrl = $_GET['my_url'];
$id = (int)$_GET['id'];
$jsId = "parent.document.getElementById('s_$id').innerHTML";
// 1. 過濾內部連結
if (strpos($targetUrl, $myUrl) !== false) {
die("");
}
// 2. 格式驗證
if (stripos($targetUrl, 'https://') !== 0 && stripos($targetUrl, 'https://') !== 0) {
die("");
}
// 3. 抓取並分析
$content = my_file_get_contents($targetUrl);
if (trim($content) === '') {
$msg = '抓取內容失敗';
} elseif (stripos($content, $myUrl) !== false) {
$msg = '包含連結,檢查通過';
} else {
$msg = '未找到連結,請核查';
}
die("" .
($_GET['auto_check'] ? "" : ''));
}
// 提取所有 的 URL
preg_match_all('/]*href=["\']?(https?:\/\/[^"\'>\s]+)["\']?/isU', $htmlCode, $matches);
$urls = $matches[1]; // 第 1 捕獲組為 URL
function checkLink(id) {
const statusEl = document.getElementById('s_' + id);
const urlEl = document.getElementById('u_' + id);
if (!statusEl || !urlEl) return auto_check = 0; // 結束
if (auto_check && statusEl.innerHTML.includes('超時')) {
alert('請等自動檢查結束'); return false;
}
statusEl.innerHTML = '正在檢查...';
hidden_iframe.src = `check_links.php?mod=check_now&url=${encodeURIComponent(urlEl.href)}&id=${id}&my_url=${encodeURIComponent(my_url)}&auto_check=${auto_check}`;
setTimeout(() => checkTimeout(id), 25000); // 25秒超時
}
function checkTimeout(id) {
const el = document.getElementById('s_' + id);
if (el.innerHTML !== '正在檢查...') return; // 已完成
el.innerHTML = "可能超時,重新檢查";
if (auto_check) checkLink(id + 1); // 自動模式跳過
}
| 現狀痛點 | 改進方案 |
|---|---|
| 同步阻塞抓取,效率低 | 後端改用 Swoole / Workerman / PHP-FPM + cURL Multi 並發抓取;前端用 fetch/axios + Promise.allSettled 批次請求 API。 |
| 僅檢查首頁 HTML,無法檢測 JS 渲染連結 | 引入 Headless Chrome (Puppeteer/Playwright) 渲染後再檢查,或要求對方提供 sitemap.xml/API。 |
| 無 User-Agent 偽裝,易被防火牆攔截 | 輪換 User-Agent、IP 代理池、設定 Accept-Language 模擬真實瀏覽器。 |
| 編碼問題 (GBK/UTF-8 混雜) | 統一用 mb_detect_encoding + mb_convert_encoding($content, 'UTF-8') 處理。 |
| 無資料庫記錄歷史 | 建立 link_check_logs 表,記錄時間、狀態、HTTP Code、回應時間,支援趨勢圖表。 |
| 視覺編輯器相容性差 | 改用 textarea 貼上原始碼,或整合 Monaco Editor / CodeMirror 高亮顯示。 |
sleep(rand(1,3)) 或 Token Bucket 限流,避免被目標站點封禁 IP 或觸發法律風險 (如《電腦犯罪條例》)。/robots.txt,尊重 Disallow 規則。my_url 與提取出的 URL 格式,防止 SSRF (Server-Side Request Forgery) 攻擊內網服務。本工具雖屬經典「PHP 4/5 時代」作品 (使用 designMode iframe 編輯器、隱藏 iframe 異步通訊),但其「前端解析 -> 後端驗證 -> 前端輪詢更新」的架構思想在現代 SEO 監控工具中依然通用。建議將核心邏輯重構為 API 服務,前端採用 Vue/React 重寫,即可變身為專業級友鏈監控平台。