Blog

Build Log

Cloudflare Pages로 Astro 블로그 배포하면서 확인한 것

zozindev.com을 Astro와 Markdown 기반으로 바꾼 뒤 Cloudflare Pages 배포 설정도 같이 바꿔야 했다. 예전에는 정적 HTML 파일을 루트에 그대로 두는 방식이었지만, Astro를 쓰면 빌드 결과물인 dist를 배포해야 한다.

Cloudflare Pages에서 핵심 설정은 단순하다.

Build command: npm run build
Build output directory: dist

문제는 설정을 바꿨다고 바로 기존 배포본이 바뀌는 건 아니라는 점이다. 이전 배포가 그대로 보이면 CSS가 안 먹는 것처럼 보이거나, 구버전 HTML이 계속 내려오는 것처럼 보일 수 있다. 이럴 때는 최신 커밋으로 새 deployment가 실제 생성됐는지 봐야 한다.

처음 헷갈렸던 부분

처음에는 style.css가 안 먹는 줄 알았다. 하지만 실제로 확인해보니 CSS 문제가 아니라 Cloudflare Pages가 예전 배포본을 계속 보여주고 있었다. 로컬 dist/index.html에는 /style.css가 정상으로 들어 있었고, dist/style.css도 존재했다.

이런 상황에서는 브라우저에서 보이는 화면만 보고 판단하면 안 된다. 먼저 라이브 HTML이 최신 커밋의 내용인지 확인해야 한다. 페이지 문구나 최근 글 목록이 최신 소스와 다르면 빌드 결과가 아직 배포되지 않은 것이다.

배포 후 확인한 것

배포가 제대로 된 뒤에는 루트 페이지, CSS, ads.txt, robots.txt, sitemap.xml을 모두 직접 확인했다.

https://zozindev.com/
https://zozindev.com/style.css
https://zozindev.com/ads.txt
https://zozindev.com/sitemap.xml

특히 AdSense를 신청한 상태라 ads.txt와 광고 계정 meta, AdSense script가 빠지면 안 된다. 로컬 빌드만 통과해도 실제 배포 URL에서 빠져 있으면 의미가 없다.

URL 구조 문제

Cloudflare Pages는 .html 파일을 확장자 없는 URL로 정규화할 수 있다. 이때 내부 링크와 sitemap이 .html을 가리키고 있거나, _redirects에서 잘못 rewrite하면 리디렉션 루프가 생길 수 있다.

실제로 /blog//projects/가 308 redirect loop에 빠진 적이 있었다. 이건 사용자 입장에서도 문제고, AdSense 검토에서도 사이트 탐색 문제로 볼 수 있다. 그래서 최종적으로는 Astro 기본 directory output을 쓰고, 내부 링크와 canonical, sitemap을 clean URL 기준으로 통일했다.

지금 기준

현재 기준은 이렇다.

이렇게 맞춰두면 sitemap과 canonical이 실제 접근 가능한 URL을 가리킨다. 검색 엔진과 AdSense 검토가 따라 들어갔을 때도 리디렉션 루프가 없다.

배운 점

정적 사이트 배포는 단순해 보이지만, URL 구조와 빌드 산출물 위치가 조금만 엇갈려도 바로 티가 난다. 특히 AdSense 심사 전에는 로컬 빌드가 아니라 실제 라이브 URL을 기준으로 확인해야 한다.

앞으로 새 페이지를 만들 때도 같은 기준으로 볼 생각이다. 페이지가 열리는지, CSS가 적용되는지, canonical이 실제 URL과 맞는지, sitemap에 들어갔는지까지 확인하고 배포해야 한다.