Problema com permalinks após migração

Olá,

Consegui migrar com sucesso um antigo software de fórum desenvolvido internamente para o Discourse. Após a importação de 2 milhões de registros que durou 24 horas, tudo funciona perfeitamente, exceto os links permanentes (permalinks).

Tenho cerca de 350.000 permalinks na tabela permalinks do banco de dados do Discourse. Todos estão em minúsculas, por exemplo: “forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html”.

Infelizmente, o Google aponta para “/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/” e recebo um erro 404. :frowning:

Alguma sugestão de como posso converter a URL da solicitação para minúsculas antes de consultá-la na tabela de permalinks, sem quebrar nada mais? Essa conversão antes da consulta não deveria ser padrão?

Obrigado pelo excelente software!

Göks

Bem-vindo! Parabéns por chegar até aqui!

Você quer criar uma normalização de permalink que descarte o slug e crie links que incluam apenas o ID do fórum, eu acho.

Tudo o que é necessário para identificar o tópico correto é t140842-s1, certo?

Existem alguns outros importadores que fazem isso, embora eu não tenha certeza de quais. Talvez o vBulletin? Mas se você fizer um grep em todos eles para normalização, deve encontrar meu exemplo.

1 curtida

Obrigado pela resposta rápida.

Não sabia antes da migração que a pesquisa diferencia maiúsculas de minúsculas — caso contrário, teria tentado levar isso em consideração e me certifiquei de que a URL fosse salva exatamente como estava no software antigo.

Mas agora já estou pós-migração e o site está em produção. Portanto, infelizmente, estou procurando maneiras de contornar isso.

Posso identificar um tópico pelo seu ID, então “/forum/t140842” seria suficiente. Via SQL, eu poderia modificar o campo url na tabela permalinks dessa forma, mas isso fará com que a pesquisa e o redirecionamento funcionem? Fiz um teste rápido e não funcionou.

Existe uma opção para normalização de permalinks nas configurações do Discourse, mas não entendi exatamente o que ela faz.

A normalização de links permanentes reescreverá a URL antes que ela corresponda ao link permanente, permitindo que você a use para remover o slug. A descrição nas configurações explica isso, mas talvez apenas se você já entender o conceito. :man_shrugging:

Os IDs antigos dos tópicos devem estar em topicCustomField, então você deverá ser capaz de criar novos links permanentes iterando sobre eles. Depois, basta excluir os antigos (ou exclua todos assim que tiver certeza de que consegue criar os que deseja).

Você pode pesquisar aqui e nos outros importadores por “permalink” e “normalização” para encontrar alguns exemplos (grep -r é uma maneira). Se precisar de mais ajuda e tiver um orçamento, posso ajudar na próxima semana.

1 curtida

Tudo bem, então tenho esta solicitação

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

e uma normalização de permalink na configuração como

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

que deveria resultar em “forum/t140842” para a solicitação acima.

Quando adiciono a URL “forum/t140842” à tabela de permalinks do Discourse, não vejo nenhum efeito?
Minhas suposições estão corretas? O que estou esquecendo?

Você está no caminho certo. A parte das expressões regulares pode ser complicada. Acredito que você precise de forum/ no início do seu link permanente.

Obrigado pelo esforço. Agradeço.

Na configuração, mudei minha regex agora para (quer dizer, a minha deveria corresponder também ao ID do tópico)

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

Quando adiciono um novo permalink na tabela com a URL “forum/t140842” e salvo… o Discourse altera a URL para “f?$forum/t140842”. Ou há um bug ou eu não entendi o conceito aqui.

:confused:

Após tentar novamente a normalização com regex, não consegui entender como isso funciona.
Usar o exemplo na descrição causou novamente resultados inesperados no campo de URL ao adicionar novos permalinks.

Ao migrar para o Discourse, removi o prefixo www do domínio.
Isso me deu agora a oportunidade de reescrever a URI no servidor antigo, por meio da configuração do Apache e do .htaccess, convertendo-a para minúsculas antes de redirecionar para o novo servidor Discourse. Isso resolveu meu problema de certa forma por enquanto.

Não funcionou como esperado porque a parte do slug da URL foi gerada no script de migração de forma ligeiramente diferente do que no software antigo.

Então, eu “normalizei” a URL por conta própria.

Adicionar/gerar URLs normalizadas (Tabela de Permalinks do Discourse)

No campo de URL, pegue:

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

ou

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

ou

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

e converta para uma URL simples contendo apenas o ID do tópico antigo:
forum/t140842

Isso é feito por um comando SQL que reescreve a URL usando a função REGEXP_REPLACE:

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;

Reescrever solicitações antigas via .htaccess no domínio antigo

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

O que acontece aqui?

O Google indexou e está linkando para a URL https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html. Tive a sorte de que essa solicitação foi atendida por um servidor Apache devido a um domínio diferente, o que me permitiu usar o .htaccess para reescrever facilmente. Assim, estou reescrevendo essa solicitação para https://discourse-domain.com/forum/t140842. Na tabela de permalinks, adicionei o registro forum/t140842 usando o permalink já existente com a URL completa com slug, por meio de uma expressão regular (veja acima).

Espero que isso ajude alguém como ponto de partida.

1 curtida