Redirecionar URLs antigas do fórum para novas URLs do Discourse usando permalinks

Redirecionando URLs Antigas de Fóruns para Novas URLs do Discourse Usando Permalinks

Se você migrou de outro software de fórum para o Discourse usando um de nossos scripts de importação, provavelmente deseja que todos os seus resultados de pesquisa do Google, conquistados com tanto esforço, continuem apontando para o mesmo conteúdo. O Discourse possui uma maneira integrada de lidar com isso para você, como alternativa à criação de regras no nginx, usando a tabela de pesquisa de permalinks.

A tabela de permalinks permite definir duas coisas: uma URL para corresponder e o que essa URL deve exibir. Existem algumas opções para definir para onde a URL deve redirecionar. Defina uma destas:

  • topic_id: para exibir um tópico
  • post_id: para exibir uma postagem específica dentro de um tópico
  • category_id: para exibir uma categoria
  • tag_id: para exibir uma tag
  • user_id: para exibir um perfil de usuário
  • external_url: para redirecionar para uma URL que pode não pertencer à sua instância do Discourse

Por exemplo, se as URLs dos tópicos do seu fórum original eram como http://example.com/discussion/12345 e a URL desse tópico após a importação é http://example.com/t/we-moved/987, você pode configurar o mapeamento assim:

cd /var/discourse
./launcher enter app
rails c
Permalink.create(url: '/discussion/12345', topic_id: 987)

O Discourse então executará um redirecionamento com código de status de resposta http 301 (movido permanentemente) para a URL correta para o ID do tópico 12345. O 301 deve fazer com que os mecanismos de busca atualizem seus registros e comecem a usar as novas URLs.

Se você deseja que algumas URLs redirecionem para fora do Discourse, pode fazê-lo definindo external_url:

Permalink.create(url: '/discussion/12345', external_url: 'http://archived.example.com/discussion/12345')

Comportamento Importante para Permalinks Externos em URLs de Tópicos

Quando um permalink external_url é criado para uma URL de tópico do Discourse (por exemplo, /t/some-slug/123) para redirecionar para um site externo, lembre-se:

  • o tópico original deve ser soft-deleted (não hard-deleted)
  • o tópico deve pertencer a uma categoria pública

Por quê: se o tópico ainda estiver ativo, o Discourse o resolve normalmente e a pesquisa de permalink não é usada. Se o tópico estiver em uma categoria privada, as verificações de permissão podem retornar 404 antes que o redirecionamento do permalink externo seja aplicado.

Isso é especialmente relevante para navegação no aplicativo (usuários logados), onde as rotas podem ser solicitadas como JSON/XHR.

Informações Adicionais

Para encontrar o ID de uma subcategoria, você pode procurá-lo pelo slug assim:

Category.find_by_slug('products').id

Para excluir o permalink para essa URL, faça isto:

Permalink.find_by_url("/blah").destroy

Pode haver apenas um registro de permalink por URL, então basta pesquisar pela URL.

Criação de um Mapa de Tópicos do MyBB para Discourse

Perguntas sobre Redirecionamento do Discourse para WordPress

Normalização de Permalink


Última Revisão por @SaraDev em 2022-06-03T20:00:00Z

37 curtidas

É possível armazenar a regra de reescrita diretamente no cluster Docker do Discourse? Existe um servidor web que cuida do HTTP e SSL, posso adicionar algo lá?

location /threads/ {
    rewrite ^/threads/(.*)\\.\\d+/?$ /t/$1 permanent;
}

Não vejo como isso pode funcionar, já que o nginx não conhece os novos IDs de tópico. Os IDs de /threads precisam ser convertidos para o ID de tópico do Discourse.

se eu chamar /threads/name.1234 ele é reescrito para /t/name e então mostra a postagem correta, o id não é usado naquele momento, acabei de testar isso.

Provavelmente só quando você tiver sorte e o Discourse e o seu fórum antigo gerarem os mesmos slugs (e o slug não começar com um número), mas isso provavelmente é bom o suficiente.

Se você quiser mudar o NGINX como sugere, pode olhar o template da web em discourse_docker para ver como mudar a configuração do nginx dentro do container. Aqui está um exemplo:

1 curtida

muito obrigado, acho que seria suficiente distração

tenho que fazer essa alteração a cada atualização?

Não. Você adicionará isso ao seu app.yml e ele será aplicado a cada reconstrução.

Para economizar tempo de teste, você pode:

cd /var/discourse
./launcher enter app
apt update
apt-get install -y vim nano

Em seguida, use vim ou nano para editar o que você quiser ver se ele faz o que você pensa (e economizar 10-20 minutos por reconstrução). Você pode reiniciar o nginx com sv restart nginx.

Nada do acima foi testado, mas deve estar perto.

1 curtida

Obrigado pela ajuda, ajustei a configuração do nginx e funciona como esperado.

1 curtida

Onde no app.yml isso deve ser escrito para que o nginx seja ajustado automaticamente? Na área de execução para os comandos personalizados?

porque (\u003cunknown\u003e): encontrado caractere de escape desconhecido ao analisar um escalar entre aspas se eu adicionar isso:

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "# auth_basic_user_file /etc/nginx/htpasswd;"
      to: "# auth_basic_user_file /etc/nginx/htpasswd;

      location /threads/ {
          rewrite ^/threads/(.*)\.\d+/?$ /t/$1 permanent;
      }"

Dê uma olhada em Configurar Let’s Encrypt com vários domínios/redirecionamentos e use o mesmo tipo de coisa do exemplo que adiciona à configuração do nginx.

Você pode colocá-lo no hook after_ssl (que você adicionaria), como naquele.

Eu ainda recebo o mesmo erro, acho que tem algo a ver com a minha formatação.

1 curtida