본문으로 바로가기

봇용 Markdown

애플리케이션의 HTML 페이지는 본문을 탐색 메뉴, 스크립트, 레이아웃 마크업으로 감쌉니다. 일부 AI 크롤러와 답변 엔진은 더 간결한 표현이 제공되면 이를 받아들입니다. 이 기능은 콘텐츠 협상으로 요청하는 클라이언트에 페이지의 Markdown 표현을 제공하고, 일반 방문자에게는 기존 HTML을 그대로 전달할 수 있습니다. 선택적으로 활성화하는 호환성 기능이며, 특정 클라이언트가 결과를 어떻게 해석하거나 사용하는지 보장하지 않습니다.

AI 크롤러 제어와 함께 사용할 수 있습니다. AI 크롤러 제어는 접근 정책을 설정하고, 이 기능은 요청 중 어떤 콘텐츠를 제공할지 결정합니다.

무료 코어 기능이며 기본적으로 꺼져 있습니다.

동작 방식

활성화하면 콘텐츠 협상 미들웨어가 등록됩니다. 일반 응답을 생성한 다음, 다음 두 조건을 모두 만족할 때만 Markdown으로 교체합니다.

  1. 요청이 Markdown을 요구합니다. 명시적 Accept: text/markdown 헤더, ?format=md 쿼리, 또는 선택적으로 user-agent로 식별한 알려진 AI 크롤러 요청입니다.
  2. 해당 라우트에서 Markdown 소스를 찾을 수 있습니다.

그 외에는 응답을 변경하지 않고 통과시킵니다. 일반 브라우저 응답에는 영향을 주지 않으며, 성공한 HTML 응답만 교체합니다. JSON, 리디렉션, 다운로드는 교체하지 않습니다.

php
# config/seo.php
'markdown_for_bots' => [ 'enabled' => true ],
GET /blog/my-post            → text/html   (your normal page)
GET /blog/my-post?format=md  → text/markdown
GET /blog/my-post  (Accept: text/markdown) → text/markdown

Markdown의 출처

아래 소스들이 일치하는 라우트에 Markdown을 제공할 수 있습니다. 미들웨어는 등록된 라우트 소스를 먼저 확인한 다음 라우트에 바인딩된 모델을 확인합니다. 각 모델에서는 명시적 toSeoMarkdown() 메서드가 내장 대체값보다 우선합니다. 이 메서드가 null이나 빈 문자열을 반환하면 해당 모델의 대체값은 사용하지 않습니다.

1. 모델 자체의 Markdown

등록된 라우트 소스가 콘텐츠를 반환하지 않으면, toSeoMarkdown() 메서드를 구현한 라우트 바인딩 모델이 출력을 결정합니다. ProvidesSeoMarkdown 계약을 구현하거나 메서드만 추가하면 됩니다.

php
use Rankbeam\Seo\Contracts\ProvidesSeoMarkdown;

class Post extends Model implements ProvidesSeoMarkdown
{
    use HasSEO;

    public function toSeoMarkdown(): ?string
    {
        return $this->body_markdown; // your already-clean markdown
    }
}

2. 등록된 라우트 소스

모델이 없는 라우트나 모델 출력을 재정의하려는 경우에는 라우트 이름으로 소스를 등록하세요.

php
use Rankbeam\Seo\Facades\SEO;

SEO::markdown()->register('pages.about', "# About us\n\nWe build things.");
SEO::markdown()->register('posts.show', fn ($request) => $request->route('post')->body_markdown);

3. 내장 대체값

라우트에 바인딩된 HasSEO 모델에 toSeoMarkdown() 메서드가 없으면, 미들웨어가 결정된 제목(H1), 설명, 모델의 **getContentForSEO()**로 기본 문서를 만듭니다.

markdown
# Post title

The meta description.

…the model's content…

콘텐츠는 그대로 제공됩니다

대체값은 getContentForSEO()를 그대로 출력합니다. 콘텐츠가 Markdown이 아니라 HTML이면 toSeoMarkdown() 메서드를 구현해 변환을 제어하세요. seo.markdown_for_bots.build_from_content = false로 대체값 기능을 완전히 끌 수 있습니다.

설정

php
// config/seo.php
'markdown_for_bots' => [
    'enabled'            => false,    // off by default; the middleware isn't registered until true
    'auto_register_middleware' => true,
    'serve_to_known_bots' => false,   // also serve to known AI crawlers by user-agent
    'query_param'        => 'format', // the ?format=md trigger
    'query_value'        => 'md',
    'build_from_content' => true,     // build from getContentForSEO() when no toSeoMarkdown()
],

명시적인 Accept / ?format 신호만으로 콘텐츠를 협상하려면 serve_to_known_bots를 꺼 두세요. 켜면 GPTBot, ClaudeBot, PerplexityBot 등 AI 크롤러 카탈로그로 식별한 크롤러가 요청하지 않아도 Markdown을 제공합니다.

rankbeam/laravel-seo는 MIT 라이선스로 배포됩니다.