Cloudflare·배포 기록
정적 사이트를 Cloudflare Pages에 올리고 GitHub Actions로 빌드를 돌리면서 걸린 문제를 모은 곳입니다. www와 끝 슬래시 리디렉션, 글을 내린 뒤에도 남는 옛 HTML, pages.dev 프리뷰 주소의 색인, 예약 발행 빌드가 제때 돌지 않는 문제, Cloudflare Web Analytics 설치와 이메일 난독화를 다룹니다.
배포 쪽 문제는 로컬 빌드에서는 보이지 않고 라이브에서만 드러나는 경우가 있습니다.
비슷한 증상이 보이면 라이브 주소에 curl -I를 보내 상태 코드와 응답 헤더부터 확인해 보시기 바랍니다.
글 12편
링크 점검기가 /cdn-cgi/l/email-protection 을 404로 잡는데, 고장 난 건 없었습니다
Cloudflare 이메일 난독화가 켜지면 mailto가 /cdn-cgi/l/email-protection 링크로 바뀝니다. 그 404가 어디서 오는지, JS를 끄면 무엇이 사라지는지 재 보고, Hugo에서 메일 주소만 빼는 주석이 두 번 지워지는 것도 확인했습니다.
읽기 →저장소만 있으면 블로그가 다 살아날 줄 알았는데, 레포 밖에 설정이 여섯 가지 있었습니다
Hugo 블로그를 새로 clone해 빌드했더니 라이브 파일 171개와 바이트까지 같았습니다. 그런데 DNS, 리다이렉트 규칙, 시크릿, 배포 이력은 저장소에 없었고 그중 리다이렉트 규칙은 배포용 토큰으로 읽을 수도 없었습니다.
읽기 →Cloudflare Pages 미리보기 배포에서 링크를 누르면 운영 사이트로 넘어갑니다
템플릿이 절대 주소를 쓰면 미리보기 배포의 링크와 CSS가 운영 도메인을 가리켜 404가 납니다. Hugo baseURL을 배포마다 바꾸는 법과, CF_PAGES_URL에 기댈 수 없는 직접 업로드에서 주소를 계산하는 스텝을 재서 정리했습니다.
읽기 →커스텀 도메인을 붙여도 pages.dev 주소는 계속 열려 있습니다
커스텀 도메인을 붙인 뒤에도 프로젝트.pages.dev 주소가 같은 내용을 noindex 없이 내주고 있었습니다. _headers 규칙을 미리보기 배포로 먼저 시험하고, production에 넣은 뒤 두 주소의 헤더를 다시 찍었습니다.
읽기 →Cloudflare Pages에 www를 붙였더니 522가 났습니다 — DNS만으로는 안 됩니다
www 레코드를 하나 추가했더니 522가 0.2초 만에 돌아왔습니다. Pages에 도메인을 따로 등록해야 열리고, 열린 www는 apex의 사본입니다. DNS, Pages, 리다이렉트 규칙을 한 단계씩 걸며 직접 쟀습니다.
읽기 →Cloudflare Pages에서 끝 슬래시 없는 링크가 308을 한 번 더 타고 있었는지 확인했습니다
제 Cloudflare Pages 사이트에서 /posts/x 는 /posts/x/ 로 308 리다이렉트됐습니다. 로컬에서는 드러나지 않는 이 한 홉을 Hugo 빌드 결과물에서 찾는 검사를 만들고, 틀린 링크를 일부러 넣어 잡히는지 확인했습니다.
읽기 →Cloudflare Pages에서 내린 글이 내 도메인에서만 계속 열렸습니다
draft로 돌린 글이 pages.dev에서는 404인데 커스텀 도메인에서는 옛 본문이 200으로 남았습니다. Purge로도 안 지워졌고, 그 주소에 Hugo alias를 두어 배포로 덮었습니다.
읽기 →못 덮었던 통계를 덮었습니다 — 남은 가설은 맞았고, 대신 두 가지를 잃었습니다
앞선 글을 「수집 경로가 안 열려 있다」는 미확인 가설로 닫았습니다. 그 가설이 맞았고, 설치 모드를 바꾸자 세 호스트가 전부 204로 돌아섰습니다. 다만 전환 뒤에도 curl 재현은 여전히 404였고, 무결성 속성과 EU 방문자 제외 설정을 함께 잃었습니다.
읽기 →통계를 티스토리 서브도메인까지 덮으려다 — 아직 못 덮었습니다
티스토리 스킨에 측정용 스크립트를 손으로 넣었더니 수집 경로가 POST 404를 돌려줬습니다. 가짜 토큰도 똑같이 404라 토큰은 아니고, 같은 주소의 OPTIONS는 200이라 호스트 등록도 아니라고 봤습니다. 남은 가설도, 배포 순서를 정한 근거도 아직 확인하지 못했습니다.
읽기 →예약 발행이 또 안 떴습니다 — 빈 커밋은 밀기 전에 접었습니다
공개일이 된 글이 라이브에 없었습니다. 빈 커밋으로 되살리려다 워크플로 설정을 보고 접었고, 로컬과 CI 의 타임존이 어긋난 탓인 줄 알았던 것도 재보니 아니었습니다.
읽기 →push 한 번으로 배포되게 만들면서 걸린 것들
설정 파일이 막아줄 거라 믿었는데 경고만 내고 통과시켰습니다. 버전을 두 곳에 적지 않는 방법, 배포 순서가 뒤집히는 문제, 그리고 예약 발행이 정적 사이트에서 왜 그냥은 안 되는지 적었습니다.
읽기 →배포는 성공했는데, 없는 주소가 200을 돌려주고 있었습니다
확인하려던 것과 다른 게 걸렸습니다. 존재하지 않는 주소가 전부 홈 내용을 200으로 응답하고 있었고, 원인은 파일 하나가 없어서였습니다. 대조군을 넣어보고서야 알았습니다.
읽기 →