aliases가 현재 URL과 동일할 때 리디렉션 루프 방지

변경 요약

  • Frontmatter aliases에 현재 문서와 동일한 경로가 포함되었을 때, 별도의 리디렉션 파일을 생성하지 않도록 건너뛰어 무한 리디렉션을 예방.

변경된 파일

  • quartz/plugins/emitters/aliases.ts

주요 구현 포인트

  • 각 alias 대상에 대해 simplifySlug(aliasTargetSlug) === ogSlug인 경우 continue로 스킵.
  • 상대 경로 alias는 현재 슬러그 기준으로 정규화 후 비교(path.join(ogSlug, '..', alias)simplifySlug).
  • 유효한 alias에 대해서만 resolveRelative(aliasTargetSlug, ogSlug)를 사용해 정적 리디렉션 HTML을 생성.

실제 변경된 코드 (diff)

diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts
@@ async function* processFile(ctx: BuildCtx, file: VFile) {
   const ogSlug = simplifySlug(file.data.slug!)
 
   for (const aliasTarget of file.data.aliases ?? []) {
     const aliasTargetSlug = (
       isRelativeURL(aliasTarget)
         ? path.normalize(path.join(ogSlug, "..", aliasTarget))
         : aliasTarget
     ) as FullSlug
 
+    // 동일 슬러그로 해석되는 alias는 리다이렉션 생성 스킵
+    if (simplifySlug(aliasTargetSlug) === ogSlug) {
+      continue
+    }
+
     const redirUrl = resolveRelative(aliasTargetSlug, ogSlug)
     yield write({
       ctx,
       content: `
         <!DOCTYPE html>

참고로, 직전 변경에서 상대 경로 alias를 현재 페이지 기준으로 해석하도록 보완했습니다.

// (이전 보완) 상대 경로 alias 정규화
const aliasTargetSlug = (
  isRelativeURL(aliasTarget)
    ? path.normalize(path.join(ogSlug, "..", aliasTarget))
    : aliasTarget
) as FullSlug

왜 변경했는가

  • 템플레이터/수동 편집으로 동일 경로 alias가 주입되는 경우가 있어, 빌드 산출물에서 자기 자신으로의 리디렉션이 생성 → 무한 루프 유발.
  • 동일 슬러그 감지 시 생성을 건너뛰어 안전성 확보.

운영 체크리스트

  • Vault 측 alias 생성 스크립트는 중복 경로를 최대한 피하도록 유지.
  • 배포 전 npx quartz build -o public && git status public로 예상치 못한 대량 리디렉션 생성 여부를 점검.

커밋/PR 메타

  • 로컬 커밋(사이트 레포): f955e38 — fix(aliases): skip redirects to same slug
    • 파일: quartz/plugins/emitters/aliases.ts
    • 요약: 동일 슬러그 alias 감지 시 리다이렉션 생성을 건너뛰도록 가드 추가
  • 업스트림 PR(Quartz v4): fix: skip self-referential redirects

재현/검증 방법

  • 재현용 frontmatter 예시
---
title: Example
permalink: /guide/example
aliases:
  - /guide/example   # 동일 경로 alias (self-referential)
---
  • 기대 동작
    • 이전: /guide/example.html에 대해 자기 자신으로의 리디렉션 페이지가 생성되어 루프 유발 가능
    • 이후: 동일 슬러그로 해석되는 alias는 스킵되어 리디렉션 산출물이 생성되지 않음
  • 로컬 확인 절차
    • npx quartz build --serve로 미리보기에서 해당 경로 접근 시 정상 렌더링(리디렉션 없음)
    • npx quartz build -o public && rg "<meta http-equiv=\"refresh\"" public/guide -n에서 관련 리디렉션 파일이 없는지 점검

여담/설계 노트

  • 비교는 simplifySlug()를 통해 정규화된 슬러그 기준으로 수행하므로, /a, /a/, /a/index 등 동등 경로 변형도 안전하게 처리됩니다.
  • 상대 경로 alias (../foo, ./bar)는 현재 파일의 ogSlug 기준으로 정규화 후 비교합니다.
  • 추후 frontmatter에서 permalink를 자동 alias에 포함시키는 로직과의 상호작용도 동일 가드로 보호됩니다.