Problema com redirecionamentos de permalink devido ao fragmento após "#" não ser enviado ao servidor

EDIT: alterei o título do tópico para refletir o problema que descobri, graças às respostas abaixo

Estou tendo um comportamento estranho com os permalinks no meu trabalho de migração.

Meu problema não é o de links internos que não redirecionam. Estou apenas testando isso colando URLs na barra de endereços do meu navegador.

Estes são os dois redirecionamentos que pretendo que ocorram nos meus testes:

esse é um redirecionamento de post, deveria redirecionar para o segundo post assim:

esse é um redirecionamento de tópico, deveria ir para:

Sei que minhas normalizações estão funcionando corretamente. Minha expressão regular é:

/(?:.*)(\/)(?<topicid>\d*.)-(.[^\/#\?]*)(?<parm>\?(\w*)[=](?<start>\d+))?(?:\/)?(\D+(\/)?)?(?<postid>\d+)?(?:\/)?/normalized.\k<topicid>.\k<postid>

E eu as verifico no console do rails:

irb(main):069:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs#16249')
=> "normalized.17978.16249"

irb(main):068:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs')
=> "normalized.17978."

Isso é o que eu pretendia. Tenho isso na minha tabela Permalinks:

E é assim que aparece no banco de dados:

Mas quando coloco isso na URL do navegador

ele é redirecionado para

Em vez do que deveria ser

Então eu vejo o primeiro post, ele não rola até o segundo como deveria.

Por que esse hash #16249 está sendo adicionado novamente, se minha normalização o removeu?

Outra maneira de expor essa incongruência (embora de forma um pouco artificial) é tentar os seguintes redirecionamentos a partir da barra de endereços do navegador:

https://community.suitecrm.com/normalized.17978.
correto redireciona para:
Reports disappeared - 💬 General Discussion - SuiteCRM

E Why two Italian language packs? - #2 by roberto - Translation and Language Packs - SuiteCRM
corretamente redireciona para
Reports disappeared - #2 by erevodifosin - 💬 General Discussion - SuiteCRM

Então por que não funciona quando passa pelo processo normal?

Permalinks funcionam apenas para links de entrada, está claro na descrição.

Você precisará corrigir os links internos.

Mencionei no início do meu post que não é esse o caso; não estou clicando em links nos meus próprios fóruns.

Mas talvez eu não esteja entendendo o que se entende aqui por “links internos”. Você poderia explicar melhor? Se eu colar uma URL na barra de endereços do navegador, como isso se torna um link interno?

O identificador de fragmento da URL (o # e tudo o que vem depois) nunca é enviado ao servidor pelo navegador — você não pode usá-lo como parte de um redirecionamento.

Agora que você diz isso, faz sentido… mas é bastante deprimente.

Acho que isso elimina completamente redirecionamentos adequados no nível de post dos meus fóruns antigos, já que eles usam # para isso :sob:

Essa é uma limitação comum que as pessoas enfrentaram em migrações? Esse é o software Kunena, imagino que seja bastante comum, e aposto que outros também usam hashes para linkar posts…

Tenho pensado muito sobre isso. É uma limitação tão irritante. Acho que o erro básico foi cometido há muito tempo, pelos designers dos fóruns Kunena, ao usar apenas fragmentos para marcar links de posts… suspiro.

Vejo três abordagens que o Discourse poderia adotar para contornar isso (estou entrando claramente no território do pensamento mágico aqui, aproveitem a viagem):

  1. O Javascript entra em ação quando a página carrega, reconhece que há um fragmento de hash na URI e o usa para chamar o servidor e redirecionar novamente para o local correto. Funciona, mas você tem um redirecionamento duplo, e o usuário vê a página recarregando.

  2. O Discourse poderia adicionar (no lado do servidor) uma tag id com o antigo post_id importado ao HTML de cada post. Assim, o navegador transferiria o antigo id de hash e o usaria na página redirecionada, rolando até o final. Principal ressalva: a rolagem sofisticada do Discourse, onde os posts são carregados apenas quando você rola até eles, torna esse esquema insuficiente.

  3. Uma mistura das anteriores: o Discourse constrói (no lado do servidor) uma tabela de correspondência entre os antigos post_ids importados e os novos post_numbers, e a envia ao cliente quando a página carrega. O Javascript no cliente reconhece que há um hash na URI, traduz esse hash usando a tabela e usa suas próprias funções de rolagem para descer até o post correto.

Isso seria trabalhoso de implementar e teria um custo de desempenho. No entanto, permitiria que migrações perfeitas ocorressem…

Estas não são soluções completas, pois os redirecionamentos ainda não funcionarão a menos que o usuário já esteja no Discourse. Links externos têm muito menos probabilidade de chegar dessa forma.

Minha abordagem atual para redirecionamentos internos/externos é a seguinte:

Meu site antigo está em
https://suitecrm.com/suitecrm/forum/, e o novo em
https://community.suitecrm.com/

Quando o servidor migrado entrar no ar, faremos um redirecionamento de Gateway do antigo para o novo.

Deixo meus links internos inalterados, começando com https://suitecrm.com/suitecrm/forum/. Quando alguém clica neles, isso é externo para todos os efeitos práticos. Mas então nosso redirecionamento de Gateway ocorre, e ele retorna ao Discourse, e os permalinks devem funcionar normalmente.

Certo? Ainda não testei isso… Acredito que isso seria impossível se quiséssemos usar o mesmo nome de domínio e pasta, mas não queremos.

O que você precisa fazer é usar redirecionamentos de permalink.

Eu costumo criar permalinks como /oldpost/POST_ID e, em seguida, criar um redirecionamento de permalink para reescrever /forum./category/someslug#1234 para usar esses links.

Ao dizer “redirecionamento de permalink”, você se refere à configuração do site normalizações de permalink?

Ops! Sim. Desculpe. Meu cérebro já estava no fim do dia.

Ok :slight_smile:

Mas estou usando normalizações de permalink (veja minha primeira postagem). Apenas a parte do hash não é enviada ao servidor (nunca), então, a menos que haja algum recurso de JavaScript no lado do cliente fazendo sua mágica, não há como um fórum que usa apenas hashes para links no nível de post ser nunca migrado corretamente (em termos de redirecionamentos) para o Discourse (ou para qualquer outro software).

Desculpe. Não li isso com atenção suficiente. Pensei que já tivesse usado conteúdo após o hash antes, mas acho que estava errado. Lembro de um caso recente em que esses IDs de post com hash estavam presentes, mas acho que o cliente queria apenas redirecionamentos no nível do tópico. Acho que, para redirecionamentos 301, chegar ao tópico correto provavelmente é suficiente.