以下の手順を作業用チェックリストとして使い、プロジェクトで確認できた根拠、対象範囲、制約に合わせて調整してください。
実務的な手順
- 確認対象のページとブラウザーの開発者コンソールを開きます。モバイルのはみ出し確認では、先にレスポンシブモードにします。
- コードを確認し、スクリプト全体をコンソールへ貼り付けてEnterを押します。現在のページを読み取ります。サイトマップメタデータツールと同一オリジンのチェッカーだけが、回数を制限してリクエストを送ります。
- コンソールの出力またはダウンロードしたCSV/JSONを確認します。ブラウザーのポリシー、認証状態、未対応のサーバーメソッドによって、判定できない項目が残る場合があります。
(async () => {
const MAX_URLS = 200;
const CONCURRENCY = 4;
const TIMEOUT_MS = 10000;
const deadline = Date.now() + 45000;
const origin = location.origin;
const allUrls = [...new Set([...document.links].map((link) => {
try { const url = new URL(link.href); url.hash = ''; return url.origin === origin && /^https?:$/.test(url.protocol) ? url.href : ''; } catch { return ''; }
}).filter(Boolean))];
const urls = allUrls.slice(0, MAX_URLS);
const results = new Array(urls.length);
let cursor = 0;
async function worker() {
while (cursor < urls.length && Date.now() < deadline) {
const index = cursor++;
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), Math.min(TIMEOUT_MS, deadline - Date.now()));
try {
const response = await fetch(urls[index], { method: 'HEAD', credentials: 'omit', redirect: 'follow', cache: 'no-store', signal: controller.signal });
results[index] = { url: urls[index], status: response.status, finalUrl: response.url, result: response.status === 405 || response.status === 501 ? 'HEAD unsupported; check manually' : response.ok ? 'OK' : 'HTTP error' };
} catch (error) {
results[index] = { url: urls[index], status: '', finalUrl: '', result: error.name === 'AbortError' ? 'timeout' : 'blocked or network error' };
} finally { clearTimeout(timer); }
}
}
await Promise.all(Array.from({ length: Math.min(CONCURRENCY, urls.length) }, worker));
for (let index = 0; index < urls.length; index++) if (!results[index]) results[index] = { url: urls[index], status: '', finalUrl: '', result: 'not checked: 45-second runtime limit' };
console.table(results);
if (allUrls.length > MAX_URLS) console.warn('Only the first ' + MAX_URLS + ' of ' + allUrls.length + ' unique internal URLs were checked.');
console.info('Checked ' + results.filter((row) => !row.result.startsWith('not checked')).length + ' of ' + urls.length + ' unique same-origin links with HEAD requests. Limits: ' + MAX_URLS + ' links and 45 seconds. Unsupported HEAD, access restrictions, or browser policy can make a result inconclusive. No cookies were sent.');
})();実行前に内容を確認してください。このスクリプトは現在のページを読み取ります。リクエストを送るのはサイトマップとリンクの監査だけで、回数は制限されています。cookieは送信せず、サイトの内容も変更しません。