DaleStudy / DaleStudy/dalestudy.com
SEO 개선: canonical·색인 차단·trailing slash 정리
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 3
- Forks
- 3
- Avg merge
- 22h 40m
- Merged PRs (30d)
- 4
Description
배경
이 저장소는 SEO를 필수 원칙으로 두고 마케팅 페이지 전체를 빌드 타임에 정적 HTML로 prerender합니다. 실제로 beta.dalestudy.com을 점검한 결과 prerender, title, description, Open Graph, hreflang, sitemap은 모두 정상 동작합니다.
다만 정식 도메인 전환이 끝나지 않은 데서 비롯된 문제가 몇 가지 확인됐습니다.
1. canonical이 404를 가리킵니다 (가장 시급)
src/seo.ts:20은 canonical을 항상 SITE_URL(https://dalestudy.com) 기준으로 생성합니다. 그런데 정식 도메인은 아직 구 사이트가 차지하고 있어 하위 경로가 존재하지 않습니다.
beta.dalestudy.com/about/ → canonical: https://dalestudy.com/about → HTTP 404
점검 결과:
| URL | 상태 |
|---|---|
https://dalestudy.com/ |
200 (단, 구 사이트 콘텐츠) |
https://dalestudy.com/about |
404 |
https://www.dalestudy.com/about |
404 |
존재하지 않는 URL을 canonical로 지정하면 검색엔진은 그 지시를 무시하거나 페이지를 색인에서 제외합니다. 홈은 200이지만 다른 콘텐츠(구 사이트)를 가리키므로, 베타 홈이 구 사이트에 흡수되는 형태가 됩니다.
2. 베타 사이트가 크롤링을 막지 않습니다
public/robots.txt가 모든 크롤러를 허용합니다.
User-agent: *
Allow: /
Sitemap: https://dalestudy.com/sitemap.xml
beta.dalestudy.com에서 이 파일이 그대로 서빙되므로 베타가 색인될 수 있고, 위의 잘못된 canonical과 겹치면 정식 전환 시 정리 비용이 생깁니다. sitemap 참조도 베타에서는 존재하지 않는 도메인을 가리킵니다.
3. trailing slash 불일치 (307 리다이렉트)
sitemap과 canonical은 슬래시 없는 경로를 쓰는데, 실제 서빙은 슬래시가 붙은 경로에서 이뤄집니다.
GET /about → 307 Location: /about/
GET /programs → 307 Location: /programs/
GET /en/about → 307 Location: /en/about/
세 가지 문제가 있습니다.
sitemap.xml에 적힌 URL이 곧바로 200을 주지 않아 크롤 예산이 낭비됩니다- 307은 임시 리다이렉트라 크롤러가 원본 URL을 계속 재요청하고, 링크 자산이 목적지로 넘어가지 않습니다
- 최종 페이지의 canonical은 다시 슬래시 없는 URL을 가리켜 정규 형태가 모호합니다
4. sitemap이 수동 관리입니다
public/sitemap.xml과 public/llms.txt는 손으로 관리하며, AGENTS.md에 "라우트를 추가하면 sitemap과 llms.txt도 갱신한다"는 규칙이 적혀 있습니다. 현재는 라우트 18개와 일치하지만, 수동 규칙은 결국 어긋납니다.
작업
필수
- canonical 처리 방식 결정 — 정식 전환 전까지 canonical을 자기 자신(
beta.dalestudy.com)으로 두거나, 아래 색인 차단과 묶어서 처리 - 베타 색인 차단 —
beta호스트에서는noindex또는robots.txt의Disallow: /가 적용되도록. 호스트별로 응답을 나눠야 하므로 구현 방식 검토 필요 - trailing slash 정책 통일 — 슬래시 있는 형태를 정규로 삼는다면
sitemap.xml과seo.ts의 canonical을 그에 맞추고, 없는 형태를 정규로 삼는다면 서버 설정을 바꿉니다. 리다이렉트가 남는다면 301로
권장
- sitemap·llms.txt 자동 생성 — 라우트 정의로부터 빌드 타임에 생성하면 수동 갱신 규칙이 사라집니다
- 라우트 ↔ sitemap 동기화 검사를 테스트로 — 자동 생성을 하지 않더라도, 불일치를 빌드에서 잡을 수 있습니다
- 구조화된 데이터(JSON-LD) 검토 —
Organization,WebSite스키마 추가 여부
정식 전환 시 함께 처리할 것
src/seo.ts:6-8에 이미 메모가 있습니다.
// 정식 도메인은 아직 구 사이트가 차지하고 있어 베타에서 서빙한다.
// 정식 오픈 시 `${SITE_URL}/og.png`로 되돌릴 것.
export const OG_IMAGE_URL = "https://beta.dalestudy.com/og.png";
정식 전환 체크리스트를 이 이슈에 함께 정리해 두면 좋겠습니다. 구 사이트(DaleStudy/homepage)에서 신규 사이트로 넘어갈 때의 리다이렉트 처리도 포함됩니다.
정상 확인된 항목 (참고)
작업 중 회귀시키지 않도록 기록해 둡니다.
- 모든 페이지가 정적 HTML로 prerender되며 title/description/OG가 포함됨
hreflangko / en / x-default 정상og:locale이 로케일별로 분기됨 (ko_KR/en_US)sitemap.xml의 18개 URL이 실제 라우트와 일치- OG 이미지 1200×630,
twitter:card설정됨
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with src/seo.ts, public/robots.txt, public/sitemap.xml, public/llms.txt, and the route definitions; inspect how the request host and trailing-slash behavior are handled at build and serve time. Compare the required beta indexing, canonical, redirect, and sitemap behavior with the current generated output. Done means the chosen policy is implemented consistently and the listed route and SEO checks pass without regressing the working metadata.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- web-dev
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100