Redirect old forum URLs to new Discourse URLs using permalinks

Redirecionando URLs Antigas de Fórum 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, então provavelmente deseja que todos os seus resultados de busca do Google, arduamente conquistados, continuem apontando para o mesmo conteúdo. O Discourse tem uma maneira integrada de lidar com isso para você como uma alternativa à escrita de regras do nginx, usando a tabela de consulta de permalinks.

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

  • topic_id: para mostrar um tópico
  • post_id: para mostrar uma postagem específica dentro de um tópico
  • category_id: para mostrar uma categoria
  • external_url: para redirecionar para uma URL que pode não pertencer à sua instância do Discourse

Por exemplo, se as URLs de tópico do seu fórum original fossem http://example.com/discussion/12345, e a URL desse tópico após a importação for http://example.com/t/we-moved/987, então 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 realizará um redirecionamento com código de status de resposta HTTP 301 (movido permanentemente) para a URL correta do ID do tópico 12345. O 301 deve fazer com que os motores de busca atualizem seus registros e comecem a usar as novas URLs.

Se você quiser que algumas URLs redirecionem para fora do Discourse, você pode fazer isso definindo external_url:

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

Informações Adicionais

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

Category.find_by_slug('products').id

Para excluir o permalink dessa URL, faça o seguinte:

Permalink.find_by_url("/blah").destroy

Só pode haver um registro de permalink por URL, então basta pesquisar por URL.

Criando um mapa de tópicos do MyBB para o Discourse

Perguntas sobre redirecionamento do Discourse para WordPress

https://meta.discourse.org/t/discourse-to-wordpress-redirect-questions/87031

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