Files
laralog/plugins/neatstudio.blog-seo/src/Http/SeoController.php
T
gouki f5987e7cc2
Build and Deploy / verify (push) Successful in 1m6s
Build and Deploy / deploy (push) Successful in 41s
refactor(routes): canonical URLs now match sablog format exactly
- /show-{id}.shtml (comments page: /show-{id}-{page}.shtml)
- /category-{cid}.shtml / /category-{cid}-{page}.shtml
- /archives-{YYYYMM}.shtml / /archives-{YYYYMM}-{page}.shtml
- /tag/{name}, /tagslist.shtml, /index-{page}.shtml
- slug 时代的 /posts/{slug} 等旧格式全部 301 到 sablog 格式
2026-09-09 21:21:07 +00:00

72 lines
2.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace Plugins\Neatstudio\BlogSeo\Http;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class SeoController
{
/**
* GEO:/llms.txt — 面向 LLM 的站点索引
*/
public function llmsTxt()
{
$siteName = blog_setting('site_name', config('blog.name'));
$siteDescription = blog_setting('site_description', config('blog.description'));
$posts = Post::published()->latest('published_at')->limit(200)->get();
$lines = [];
$lines[] = '# '.$siteName;
$lines[] = '';
$lines[] = '> '.$siteDescription;
$lines[] = '';
$lines[] = '## 文章(Markdown 全文可访问 /posts/{slug}.md)';
$lines[] = '';
foreach ($posts as $post) {
$lines[] = '- ['.$post->title.']('.route('posts.show', $post->id).') — '.Str::limit(strip_tags($post->excerpt_or_fallback), 120);
}
return response(implode("\n", $lines)."\n")
->header('Content-Type', 'text/plain; charset=utf-8');
}
/**
* GEO:/posts/{slug}.md — 面向 AI 爬虫的纯 Markdown 导出
*/
public function postMarkdown(Request $request, string $slug)
{
$post = Post::query()->where('slug', $slug)->firstOrFail();
if ($post->status !== 'published') {
abort(404);
}
$body = $post->content_format === 'markdown' ? $post->content : $this->htmlToMarkdown($post->content);
$out = "# {$post->title}\n\n";
if ($post->excerpt) {
$out .= '> '.$post->excerpt."\n\n";
}
$out .= $body."\n";
return response($out)->header('Content-Type', 'text/markdown; charset=utf-8');
}
private function htmlToMarkdown(string $html): string
{
$converter = new \League\HTMLToMarkdown\HtmlConverter([
'strip_tags' => false,
'hard_break' => true,
]);
return $converter->convert($html);
}
}