이전 후 영구 링크 문제

안녕하세요,

레거시 자체 개발 포럼 소프트웨어를 디스코urse로 성공적으로 마이그레이션했습니다.
200만 건의 레코드를 24시간 동안 가져온 후, 영구 링크(permalinks)를 제외하고는 모든 것이 완벽하게 작동합니다.

디스코urse의 permalinks 데이터베이스 테이블에는 약 350,000개의 영구 링크가 있습니다. 이 링크들은 모두 소문자입니다. 예를 들어, "forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html"와 같습니다.

불행히도 구글은 "/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/"로 링크를 걸고 있으며, 저는 404 오류를 받고 있습니다. :frowning:

다른 부분에 영향을 주지 않고, permalinks 테이블에서 조회하기 전에 요청 URL을 소문자로 변환하는 방법에 대한 힌트가 있을까요? 조회 전 이러한 변환은 표준 기능이지 않나요?

훌륭한 소프트웨어를 만들어 주셔서 감사합니다!

Göks

환영합니다! 여기까지 오신 것을 축하드립니다!

슬러그를 제거하고 포럼 ID만 포함하는 영구 링크를 생성하는 정규화를 만들고 싶으신 것 같습니다.

올바른 주제를 식별하는 데 필요한 것은 t140842-s1만 맞죠?

그렇게 하는 다른 가져오기 프로그램도 몇 가지 있지만, 정확히 어떤 것인지 확신은 없습니다. 아마도 vBulletin일까요? 하지만 정규화 관련해서 모두를 grep으로 검색해 보시면 예시를 찾으실 수 있을 것입니다.

빠른 답변 감사합니다.

마이그레이션 전에 조회가 대소문자를 구분한다는 사실을 몰랐습니다. 알았다면 이 점을 고려하여 URL이 기존 소프트웨어에 저장된 방식 그대로 저장되도록 했을 것입니다.

하지만 지금은 마이그레이션이 완료된 상태이며 사이트가 운영 중입니다. 그래서 불행히도 우회 방법을 찾고 있습니다.

주제를 ID로 식별할 수 있으므로 "/forum/t140842

Permalink 정규화는 permalink가 매칭되기 전에 URL을 다시 작성하므로, 이를 사용하여 슬러그를 제거할 수 있습니다. 설정에 있는 설명이 이를 설명하지만, 이미 이해하고 있는 경우에만 유용할 수 있습니다. :man_shrugging:

기존 토픽 ID는 topicCustomField에 있어야 하므로, 해당 필드를 순회하면서 새로운 permalink를 생성할 수 있습니다. 그런 다음 기존 permalink를 삭제하면 됩니다. (원하는 permalink를 만들 수 있다는 확신이 들면 모두 삭제해도 됩니다.)

여기서 및 다른 가져오기(importer)에서 permalink와 정규화(normalization)를 검색하면 몇 가지 예시를 찾을 수 있습니다(grep -r 사용 가능). 더 많은 도움이 필요하고 예산이 있다면 다음 주에 도움을 드릴 수 있습니다.

자, 이렇게 요청이 있습니다

https://a3-freunde.de/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor

그리고 설정에 다음과 같은 영구 링크 정규화 규칙이 하나 있습니다.

/t(\d*)/?$forum/t\1

위 요청의 경우 "forum/t140842"가 결과가 되어야 합니다.

"forum/t140842"를 Discourse 영구 링크 테이블에 추가했는데 아무런 효과가 없습니다.
제 가정이 올바른가요? 제가 놓치고 있는 것이 있나요?

좋은 방향으로 가고 있어요. 정규식 부분은 좀 까다로울 수 있죠. 퍼마링크 앞에 forum/를 추가해야 할 것 같아요.

노력해 주셔서 감사합니다. 정말 감사드립니다.

설정에서 정규식을 이제 다음과 같이 변경했습니다. (제 정규식은 토픽 ID도 매칭되어야 합니다)

forum/t(\d*)/?$forum/t\1

"forum/t140842"라는 URL로 새 영구 링크를 테이블에 추가하고 저장하면 … discourse가 URL을 "f?$forum/t140842"로 변경합니다. 버그가 있는 것 같거나, 여기서 개념을 제대로 이해하지 못하고 있는 것 같습니다.

:confused:

정규식 정규화를 더 시도해 보았지만, 그 작동 방식을 파악하지 못했습니다.
설명문에 있는 예제를 사용했을 때, 새 영구 링크(permalink)를 추가하면 URL 필드에서 다시 예상치 못한 결과가 발생했습니다.

Discourse로 마이그레이션할 때 도메인의 www 접두사를 제거했습니다.
이로 인해 기존 서버에서 Apache 설정과 .htaccess를 통해 URI를 소문자로 변환한 후 새 Discourse 서버로 리디렉션할 수 있는 기회가 생겼습니다. 이 방법으로 현재로서는 문제를 어느 정도 해결했습니다.

URL의 슬러그(slug) 부분이 이전 소프트웨어와 약간 다르게 마이그레이션 스크립트에서 생성되었기 때문에 예상대로 작동하지 않았습니다.

그래서 저는 URL을 직접 "정규화"했습니다.

정규화된 URL 추가/생성 (Discourse Permalinks 테이블)

url 필드에서 다음 값:

forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

또는
forum/t140842-s2/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

또는
forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

을 이전 토픽의 ID만 포함된 단순한 URL로 변환합니다:
forum/t140842

이 작업은 REGEXP_REPLACE 함수를 통해 URL을 다시 작성하는 SQL 명령어로 수행됩니다:

INSERT INTO permalinks (created_at, updated_at, topic_id, url) SELECT NOW(), NOW(), topic_id, REGEXP_REPLACE(url,'forum/t(\d*)(-?.*)/(.*)','forum/t\1','') url FROM permalinks WHERE topic_id > 0 ON CONFLICT DO NOTHING;

기존 도메인에서 .htaccess를 사용하여 이전 요청 다시 쓰기

RewriteRule ^forum/t([0-9]*)(-?.*)/(.*)$ https://discourse-domain.com/forum/t$1 [R=301,L]

여기서 어떤 일이 일어나는가?

Google은 URL https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html을 인덱싱하고 링크하고 있습니다. 다른 도메인 때문에 이 요청이 Apache 서버로 끝나는 것이 행운이었습니다. 덕분에 .htaccess를 사용하여 쉽게 다시 쓸 수 있었습니다. 그래서 이 요청을 https://discourse-domain.com/forum/t140842로 다시 쓰고 있습니다. Permalinks 테이블에서는 위에서 설명한 정규식(위 참조)을 사용하여 전체 슬러그 URL이 포함된 이미 추가된 permalink를 활용하여 이 forum/t140842 레코드를 추가했습니다.

이 정보가 다른 분들에게 시작점으로 도움이 되기를 바랍니다.