直接安装spatie/laravel-sitemap即可,无需其他非官方包;v7要求laravel 10+和php 8.1+,否则需降级至v6;必须执行php artisan vendor:publish发布配置,否则报class not found或生成失败;生成后需检查robots.txt声明及app_url协议是否正确。

直接用 spatie/laravel-sitemap,别碰其他名字带 “sitemap” 但不是它家的包——比如 laravel-sitemap(多年未维护)或虚构的 Laravel Sitemap_Composer,装不上、报错多、没人修。
composer require spatie/laravel-sitemap 前先核对版本
-
spatie/laravel-sitemapv7 要求:Laravel 10+ + PHP 8.1+ - 如果你用的是 Laravel 9 或 PHP 8.0,必须指定 v6:
composer require spatie/laravel-sitemap:^6.4 - 查当前环境:
php artisan --versionphp -v - 装错版本最常见现象:
Class 'Spatie\Sitemap\SitemapGenerator' not found,不是代码写错,是根本没加载成功。
必须运行 php artisan vendor:publish
- 装完不执行这步,
sitemap:generate命令会直接报错,或生成空文件。 - 正确命令:
php artisan vendor:publish --provider="Spatie\Sitemap\SitemapServiceProvider" --tag=sitemap-config - 检查是否成功:项目根目录下应出现
config/sitemap.php - 这个配置文件不是摆设——它控制 Guzzle 请求超时、是否启用 JS 渲染、Chrome 路径等关键行为,后续调试爬不到动态路由时,大概率要调这里。
手动生成 sitemap.xml 的两种可靠方式
临时调试用(本地开发):
php artisan sitemap:generate
默认输出到public/sitemap.xml,立刻能访问/sitemap.xml看效果-
生产环境推荐自定义逻辑(避免漏掉文章、商品等动态 URL):
SitemapGenerator::create('@#@#@#@#@#@#@#@#@#@0')
→ 显式传入完整域名,别依赖config('app.url')(多子域/HTTPS 混用时容易出错)
→ 用add()主动注入模型数据,例如:foreach (Article::published()->cursorPaginate(100) as $article) { $sitemap->add(Url::create("/blog/{$article->slug}") ->setLastModificationDate($article->updated_at) ->setPriority(0.8)); }→ 别只靠generateFromApp()扫路由——它不会识别/{id}这类动态段,也不会过滤草稿或私有内容。
生成后 404 或链接全是 HTTP?检查三处硬伤
- 文件确实落在
public/sitemap.xml,不是缓存路径或 storage/ 下 - Web 服务器(Nginx/Apache)没把
.xml当作需 PHP 处理的后缀拦截掉 -
robots.txt里加了这一行:Sitemap: /sitemap.xml -
APP_URL环境变量必须是 HTTPS 开头(如果网站强制 HTTPS),否则生成的每个<loc></loc>都是错的,XML 直接被搜索引擎无视
最常被跳过的其实是 robots.txt 那一行——没有它,再规范的 XML 也等于没写。











