NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name 404 to Archive Redirecter // @namespace https://github.com/MathiasHM // @version 1.1 // @description Redirects to the most recent Internet Archive snapshot if a page shows 404 or Not Found error. // @author Mathias H. M. // @match *://*/* // @updateURL https://gist.githubusercontent.com/MathiasHM/a208620a4d784cd937c62ca77085e8db/raw/404-to-archive.user.js // @downloadURL https://gist.githubusercontent.com/MathiasHM/a208620a4d784cd937c62ca77085e8db/raw/404-to-archive.user.js // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; const currentURL = window.location.href; const archiveAPI = 'https://archive.org/wayback/available?url='; // Prevent redirect loop if (window.location.hostname.includes('web.archive.org')) return; const notFoundIndicators = [ '404', 'not found', 'page not found', 'error 404', 'requested url was not found', 'this page does not exist', 'sorry, we couldn’t find', 'file not found', 'oops!', 'cannot be found' ]; function isPage404() { const text = document.body?.innerText?.toLowerCase() || ''; const title = document.title?.toLowerCase() || ''; const url = window.location.href.toLowerCase(); return notFoundIndicators.some(k => text.includes(k) || title.includes(k) || url.includes(k) ); } function redirectToArchiveSnapshot(snapshotUrl) { console.log(`[404 to Archive Redirecter] Redirecting to snapshot: ${snapshotUrl}`); window.location.href = snapshotUrl; } function showNoSnapshotFound() { alert("🚫 This page appears to be missing, and no Internet Archive snapshot was found."); console.warn("[404 to Archive Redirecter] No archive snapshot available."); } function checkArchive() { fetch(`${archiveAPI}${encodeURIComponent(currentURL)}`) .then(res => res.json()) .then(data => { if (data?.archived_snapshots?.closest?.url) { redirectToArchiveSnapshot(data.archived_snapshots.closest.url); } else { showNoSnapshotFound(); } }) .catch(err => { console.error("[404 to Archive Redirecter] Error querying archive:", err); }); } // Wait until the page loads before checking window.addEventListener('load', () => { setTimeout(() => { if (isPage404()) { console.log("[404 to Archive Redirecter] Page appears to be missing. Checking archive..."); checkArchive(); } }, 1000); }); })();