Utilisez ces étapes comme liste de travail et adaptez-les aux éléments disponibles, au périmètre et aux contraintes du projet.
Instructions pratiques
- Ouvrez la page à vérifier et la console développeur du navigateur. Activez d’abord le mode responsive pour contrôler les débordements mobiles.
- Vérifiez le code, collez le script complet dans la console et appuyez sur Entrée. Il lit la page actuelle ; seuls l’audit du sitemap et les vérifications de liens envoient des requêtes limitées à la même origine.
- Consultez la console ou le fichier CSV/JSON téléchargé. Les règles du navigateur, l’authentification et les méthodes non prises en charge par le serveur peuvent rendre certains résultats incertains.
(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.');
})();Vérifiez le code avant de l’exécuter. Il lit la page actuelle ; seuls les audits sitemap et liens envoient des requêtes limitées à la même origine, sans cookies. Le contenu du site n’est pas modifié.