feat: sitemap.xml with dynamic name pages for SEO

SitemapController generates XML sitemap with all static pages + all
registered name pages from chain. Cached 1 hour. 140+ name pages
make each registered brand discoverable by search engines.

Commit #101.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude 2026-04-04 12:59:22 +01:00
parent 1e34701e71
commit 1a8adf46d5
No known key found for this signature in database
GPG key ID: AF404715446AEB41
2 changed files with 45 additions and 0 deletions

View file

@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
namespace Website\Lethean\Controllers;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Cache;
use Mod\Chain\Services\DaemonRpc;
class SitemapController extends Controller
{
public function __invoke(DaemonRpc $rpc): \Illuminate\Http\Response
{
$sitemap = Cache::remember('sitemap.xml', 3600, function () use ($rpc) {
$urls = [];
// Static pages
foreach (['/', '/names', '/explorer', '/services', '/pricing', '/about', '/sunrise', '/status', '/docs', '/names/register', '/services/ssl', '/services/dns-hosting', '/services/residential-proxy', '/services/mobile-proxy', '/services/seo-traffic', '/network'] as $path) {
$urls[] = ['loc' => "https://lthn.io{$path}", 'priority' => $path === '/' ? '1.0' : '0.8'];
}
// Dynamic name pages
$result = $rpc->getAllAliases();
foreach (($result['aliases'] ?? []) as $alias) {
$name = $alias['alias'] ?? '';
if ($name) {
$urls[] = ['loc' => "https://lthn.io/names/{$name}", 'priority' => '0.6'];
}
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach ($urls as $url) {
$xml .= " <url><loc>{$url['loc']}</loc><priority>{$url['priority']}</priority></url>\n";
}
$xml .= '</urlset>';
return $xml;
});
return response($sitemap, 200)->header('Content-Type', 'application/xml');
}
}

View file

@ -19,3 +19,4 @@ Route::get('/services/network', [HomeController::class, 'services'])->name('serv
Route::get('/services/residential-proxy', [HomeController::class, 'residentialProxy'])->name('services.residential');
Route::get('/services/mobile-proxy', [HomeController::class, 'mobileProxy'])->name('services.mobile');
Route::get('/services/seo-traffic', [HomeController::class, 'seoTraffic'])->name('services.seo');
Route::get('/sitemap.xml', \Website\Lethean\Controllers\SitemapController::class);