Next.js · 라우팅 · 한국어

한글 슬러그를 쓰자 정적 페이지 159개가 전부 404가 됐다

한국어 사이트니 주소도 한국어면 좋겠다고 생각했다. 빌드는 성공했고, 열면 전부 404였다.

글 주소를 이렇게 만들었습니다.

/blog/무지개는-7색이-아니다

한국어 사이트니까 주소도 읽을 수 있으면 좋겠다고 생각했습니다. 빌드는 아무 경고 없이 성공했고, 정적 페이지 159개가 만들어졌다고 로그에 찍혔습니다. 그리고 열어 보니 전부 404였습니다.

어긋나는 지점

브라우저가 저 주소를 요청할 때, 실제로 서버에 도착하는 경로는 퍼센트 인코딩된 형태입니다.

/blog/%EB%AC%B4%EC%A7%80%EA%B0%9C%EB%8A%94-7%EC%83%89...

그런데 빌드 산출물의 프리렌더 목록에는 한글 원문 그대로 기록돼 있습니다. 정적 파일 매칭은 요청이 애플리케이션 코드에 닿기 단계에서 일어나므로, 컴포넌트 안에서 decodeURIComponent를 부르든 유니코드 정규화(NFC/NFD)를 맞추든 소용이 없습니다. 매칭은 이미 끝나 있고, 결과는 404입니다.

이 문제의 고약한 점은 빌드가 성공한다는 것입니다. 에러도 경고도 없습니다. 로컬에서 프로덕션 모드로 띄워 실제로 열어 보기 전까지는 아무 신호가 없습니다.

슬러그가 한국어 검색에서 하는 일

고치면서 따로 확인한 게 있습니다. 그럼 로마자로 음차하면(/blog/mujigae-neun-7-saek) 검색에 도움이 되느냐. 답은 아니오였습니다.

URL 슬러그의 키워드 기여는 원래도 미미하고, 한국어를 로마자로 적은 문자열은 검색어와 일치하지도 않습니다. 사용자가 mujigae라고 검색하지 않기 때문입니다. 키워드를 전달하는 것은 title 태그, h1, 본문이고 이 셋이 전부 한국어라면 이미 충분합니다.

그래서 결론은 ASCII 식별자였습니다. 글 번호를 그대로 씁니다.

/blog/1
/blog/100

읽어서 뜻을 알 수 없는 주소지만, 잃는 게 없습니다. 공유될 때 보이는 것은 제목이고, 검색에 잡히는 것도 제목과 본문입니다.

가져갈 규칙

다른 제작 노트