Ghost 4 한글 Slug

한글주소를 사용할수 없는 고스트의 문제를 해결한다. 현재 고스트5가 나왔지만 방법은 비슷할 것이다.

Ghost 4 한글 Slug

고스트는 한글주소를 기본적으로 쓸 수가 없다. 그런데 주소가 검색최적화에 무척 중요하다고 해서 한글주소를 사용하려고 한다.

구글링 고고~~

https://ghost.rivario.com/ghost-한글-slug-지원하기/

위 사이트를 참조해서 수정에 들어갔다.

그런데 내 고스트의 버전은 4.대로 파일위치가 다른 것으로 보인다.

내가 개발자라면 기존에 쓰던 부분을 위치가 달라졌을지언정 어느 정도는 그대로 사용했을 것 같다. find로 검색을 해보자.

첫번째 파일

find . -name "*.js" -type f | xargs grep "validator.matches(str, "

#결과
./core/server/data/validation/index.js:    return validator.matches(str, /^[a-z0-9\-_ㄱ-ㅎㅏ-ㅣ가-힣]+$/);
grep: ./core/server/data/migrations/versions/2.37/01-add-self-signup-and-from: No such file or directory
grep: address-to-members-settings.js: No such file or directory
grep: ./core/server/data/migrations/versions/3.40/02-add: No such file or directory
grep: members-email-aggregation-columns.js: No such file or directory

역시 경로는 다르지만 찾을 수 있다.

./core/server/data/validation/index.js

vi로 수정한다.

수정은 첨에 참조했다는 사이트 참조바란다. 똑같이 하면 된다.

두번째 파일

다음 파일도 검색해 본다.

cd /var/www/blog/versions/4.1.2/
find . -name "*.js" -type f | xargs grep "string = unidecode(string)"

#결과
./node_modules/@tryghost/string/lib/slugify.js:    // string = unidecode(string);
./node_modules/@tryghost/security/node_modules/@tryghost/string/lib/slugify.js:    // string = unidecode(string);
grep: ./core/server/data/migrations/versions/2.37/01-add-self-signup-and-from: No such file or directory
grep: address-to-members-settings.js: No such file or directory
grep: ./core/server/data/migrations/versions/3.40/02-add: No such file or directory
grep: members-email-aggregation-columns.js: No such file or directory

경로는 다르지만 slugify.js 안에 같은 코드가 있다. 근데 같은 로직이 두군데 있다.

./node_modules/@tryghost/string/lib/slugify.js
./node_modules/@tryghost/security/node_modules/@tryghost/string/lib/slugify.js

두파일 모두 수정한다.

마지막 파일

find . -name "*.js" -type f | xargs grep "urlUtils.absoluteToRelative"

#결과
./core/frontend/helpers/img_url.js:        return urlUtils.absoluteToRelative(image);
./core/frontend/services/routing/controllers/entry.js:	    if (urlUtils.absoluteToRelative(entry.url, {withoutSubdirectory: true}) !== req.path) {
grep: ./core/server/data/migrations/versions/2.37/01-add-self-signup-and-from: No such file or directory
grep: address-to-members-settings.js: No such file or directory
grep: ./core/server/data/migrations/versions/3.40/02-add: No such file or directory
grep: members-email-aggregation-columns.js: No such file or directory

찾긴 찾았는데, 나는 저 부분을 encodeURI 하면 오히려 에러가 발생했다. 그래서 고스트 로그를 살펴보니 뭔가 인코딩되서 호출되고 있었다. 내 서버는 앞단에 nginx가 있는데 혹시 거기서 한글주소를 못받는건가? 해서 nginx.conf를 열어서 서버에 캐릭터셋을 utf-8로 설정해보았다. 하지만 마찬가지였다. 그래서 그냥 위 파일에 수정한 부분을 원복했다. encodeURI를 걷어내니 잘 동작하기 시작했다. 참조한 사이트와 다른이유는 앞단에 서버에서 처리가 다르지 않을까 추측해본다.