SEO 운영자 가이드
Seo plugin은 사이트별 검색 노출 정보, 공유 미리보기, sitemap, robots, SEO audit을 한 곳에서 관리합니다.
활성화
SEO 기능은 plugin이 활성화된 프로젝트에서 동작합니다. _template에는 SaaS PanelProvider에 SeoFilamentPlugin이 연결되어 있으므로 plugin 활성화 후 SaaS Panel에서 다음 메뉴가 보입니다.
| 메뉴 | 용도 |
|---|---|
Site Settings > SEO | 사이트 기본 SEO 설정 |
SEO > SEO Scopes | 독립사이트 내부 서비스 영역별 SEO 기본값 |
SEO > SEO Page Rules | route/path별 SEO override |
SEO > SEO Audits | 실제 공개 페이지 SEO 점검 |
기본 비활성 상태에서는 php artisan list seo에 command가 보이지 않을 수 있습니다. plugin provider가 활성화될 때 route, command, middleware가 등 록됩니다.
기본 설정
Site Settings > SEO에서 다음 값을 설정합니다.
| 필드 | 설명 |
|---|---|
| SEO 활성화 | managed head, sitemap, audit 기능을 켭니다. |
| 사이트 타이틀 | 페이지별 title이 없을 때 사용할 기본 title입니다. |
| 페이지 타이틀 접미사 | `Article title |
| 기본 Description | 페이지별 설명이 없을 때 사용할 설명입니다. |
| 기본 OG 이미지 URL | 공유 미리보기 기본 이미지입니다. 공개 접근 가능한 URL을 사용하세요. |
| Canonical 기준 URL | canonical host를 명시합니다. 독립 도메인이 있으면 해당 도메인을 넣습니다. |
| Locale / 대체 Locale URL | og:locale, hreflang alternate에 사용합니다. |
| Robots index/follow | 기본 색인/링크 추적 정책입니다. |
| 사이트 주체 | Organization 또는 Person structured data 기본값입니다. |
| Search Console token | Google, Bing, Naver verification token입니다. |
| Sitemap / Audit 활성화 | sitemap 출력과 audit 실행 여부입니다. |
raw HTML 입력란은 없습니다. Search Console 인증도 <meta> 전체가 아니라 content token만 저장합니다.
독립사이트별 SEO
하나의 MSK 프로젝트 안에 여러 독립사이트가 있으면 각 SaaS Product 또는 site 설정의 settings.seo가 현재 도메인에 맞게 적용됩니다.
resolver는 다음 순서로 현재 SEO context를 찾습니다.
- 현재 요청의
current.saas_product - 요청 host와
saas_products.settings.domains매칭 - 현재
current.site와saas_products.settings.site매칭
예를 들어 academy.how 프로젝트 안에서 생성된 newspaper.how 독립사이트는 newspaper.how 도메인으로 접속했을 때 newspaper SaaS Product의 SEO 설정을 사용해야 합니다.
Scope / Page Rule
scripture.how처럼 한 독립사이트 내부가 여러 서비스처럼 보이면 scope를 사용합니다.
| 예시 scope | 예시 path | SEO 의미 |
|---|---|---|
bible | /bible/* | 성경 본문 viewer |
commentary | /commentaries/* | 주석 라이브러리 |
dictionary | /dictionary/* | 성경 사전 |
typing | /typing/* | 성경 타자연습 |
SEO Scopes에서 scope 기본 title, description, robots, structured data 설정을 관리하고, SEO Page Rules에서 특정 route name 또는 path pattern에 대한 override를 추가합니다.
Sitemap / Robots
plugin route:
/robots.txt/sitemap.xml
운영 기준:
- sitemap에는 canonical URL만 넣습니다.
- admin/auth/checkout/billing/legal/system path는 기본 제외됩니다.
robots.index=false인 사이트는Disallow: /을 출력합니다.- robots raw text는 지원하지 않고 구조화된 allow/disallow 설정만 사용합니다.
SEO Audit
SEO > SEO Audits에서 단일 URL을 실행하거나 command로 실행합니다.
php artisan seo:audit https://newspaper.how/
php artisan seo:audit --sitemap=https://newspaper.how/sitemap.xml --host=newspaper.how
php artisan seo:audit --scope=articles --site=newspaper --host=newspaper.how
Audit은 실제 HTML을 가져와 다음을 저장합니다.
- title, description, canonical, robots, OG, Twitter, hreflang
- JSON-LD parse result
- h1 count, heading outline, semantic landmarks
- div outline sample, title/alt/aria/link text/image count
- missing title, duplicate description, canonical mismatch, invalid JSON-LD 등 issue
원본 HTML 전체는 저장하지 않습니다. current host 또는 allowlist host만 수집하고 private/loopback/link-local/metadata IP는 차단합니다.
운영 체크
| 증상 | 확인 |
|---|---|
| title/meta가 반영되지 않음 | plugin 활성화 여부, settings.seo.enabled, middleware 등록 여부 |
| 독립사이트 설정이 다른 사이트에 반영됨 | SaaS Product domain, settings.site, current site context |
| sitemap URL host가 틀림 | canonical_base_url, 실제 request host, reverse proxy 설정 |
| audit URL이 차단됨 | current host 또는 seo.audit.allowed_hosts allowlist |
| OG 이미지가 공유에서 안 보임 | public 접근 가능 URL인지 확인 |