diff --git a/public/.htaccess b/public/.htaccess index e9cc24c..60ef108 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -47,9 +47,10 @@ RewriteRule ^licenses/?$ /index.php?action=licenses [L,QSA] RewriteRule ^contact/?$ /index.php?action=contact [L,QSA] # Flux RSS — /feed est canonique, /rss et /rss.xml redirigent en 301 -RewriteRule ^rss/?$ /feed [R=301,L] -RewriteRule ^rss\.xml$ /feed [R=301,L] -RewriteRule ^feed/?$ /feed.php [L,QSA] +RewriteRule ^rss/?$ /feed [R=301,L] +RewriteRule ^rss\.xml$ /feed [R=301,L] +RewriteRule ^feed/([0-9a-f-]{36})/?$ /feed.php?after=$1 [L,QSA] +RewriteRule ^feed/?$ /feed.php [L,QSA] # Sitemap RewriteRule ^sitemap\.xml$ /sitemap.php [L] diff --git a/public/feed.php b/public/feed.php index 0b3696a..317ed10 100644 --- a/public/feed.php +++ b/public/feed.php @@ -29,13 +29,27 @@ $all = array_values(array_filter( } )); -$total = count($all); -$lastPage = max(1, (int)ceil($total / FEED_PAGE_SIZE)); -$page = max(1, min($lastPage, (int)($_GET['page'] ?? 1))); -$items = array_slice($all, ($page - 1) * FEED_PAGE_SIZE, FEED_PAGE_SIZE); +// ─── Pagination curseur ────────────────────────────────────────────────────── +$after = trim($_GET['after'] ?? ''); +$offset = 0; +if ($after !== '') { + foreach ($all as $i => $a) { + if ($a['uuid'] === $after) { + $offset = $i + 1; + break; + } + } +} -$feedUrl = static fn (int $p): string => $base . '/feed' . ($p > 1 ? '?page=' . $p : ''); +$items = array_slice($all, $offset, FEED_PAGE_SIZE); +$nextCursor = (count($all) > $offset + FEED_PAGE_SIZE) + ? ($all[$offset + FEED_PAGE_SIZE - 1]['uuid'] ?? null) + : null; +$feedUrl = $base . '/feed'; +$feedNextUrl = $nextCursor !== null ? $base . '/feed/' . $nextCursor : null; + +// ─── lastBuildDate ─────────────────────────────────────────────────────────── $lastBuild = ''; foreach ($all as $a) { $ts = (int)strtotime((string)($a['updated_at'] ?? $a['published_at'] ?? '')); @@ -62,21 +76,16 @@ echo '' . "\n"; fr - - + - 1): ?> - - - + 0): ?> + - -