Two Canonicals Look Like a Redirect
One symptom
서치 콘솔이 모듈 7쪽을 전부 "리디렉션 오류" 로 색인 거부했다. 브라우저로 열면 리다이렉트 같은 건 없다.
Two canonicals
프리렌더 결과 HTML 에 canonical 이 두 개 있었다. 정적 템플릿이 홈을 가리키고, Helmet 이 그 페이지 자신을 가리킨다. 구글은 둘이 충돌하면 홈으로 가라는 신호로 읽는다. 템플릿 쪽을 먼저 지우고 주입하게 바꿨다.
A folder is a redirect
고쳤는데 또 났다. 이번엔 파일을 어디에 쓰느냐가 원인이었다. 프리렌더가 모듈마다 폴더를 만들고 그 안에 index.html 을 쓰고 있었다. 디렉터리로 쓰면 호스팅이 슬래시 없는 주소를 슬래시 붙은 주소로 301 한다. canonical 은 슬래시 없는 쪽을 가리키고 있으니 또 충돌이다.
납작한 파일로 바꾸고, 주소 형태를 하나로 모으는 설정을 켰다. 이제 어떤 형태로 들어와도 한 주소에서 200 으로 끝난다.
A redirect on top of a 200
없는 모듈 주소는 홈으로 보내고 있었다. 리다이렉트 컴포넌트 한 줄이다. 주소는 200 을 돌려주는데 내용이 즉시 다른 곳으로 튄다. 봇은 이걸 200 페이지 위에 얹힌 리다이렉트로 읽는다. 그 자리에서 404 페이지를 렌더하게 바꿨다. noindex 는 이미 붙어 있었다.
같은 종류가 하나 더 있었다. SPA 는 모든 주소를 index.html 로 보낸다. 그래서 없는 주소도 빈 화면과 함께 200 을 돌려준다. soft-404 다. 외부 어딘가에 잘못 박힌 링크 하나가 멀쩡한 모듈 페이지 색인까지 끌어내리고 있었다.
증상이 하나라고 원인이 하나인 것은 아니다.
So the build checks it now
주소 목록을 모듈 정의 한 곳에서 파생하게 했다. 사이트맵도 llms.txt 도 프리렌더도 같은 목록을 쓴다. 모듈을 추가하면 세 군데가 같이 따라온다.
그리고 빌드에 검사를 붙였다. 프리렌더된 모든 페이지의 canonical 이 자기 주소를 가리키는지, 사이트맵의 모든 주소가 실제로 배포되는 파일로 떨어지는지. 하나라도 어긋나면 빌드가 실패하고 배포가 안 된다.
Also
· 서브도메인과 루트 도메인이 같은 사이트를 서빙하면서 신호를 반씩 나눠 갖고 있었다. 한쪽으로 모았다 · 언어가 하나뿐인 사이트에 hreflang 이 붙어 있었다. 게다가 모든 페이지가 자기 자신이 아니라 홈을 대체 주소로 선언하고 있었다. 언어는 html lang 이 이미 알린다 · 메타 keywords 에 브랜드를 쌓아두고 별칭을 여섯 개 달아둔 것을 걷어냈다. 스팸 신호를 스스로 심고 있었다