Redirect old forum URLs to new Discourse URLs using permalinks

Redirezionamento di URL di forum vecchi a URL di Discourse nuovi usando permalink

Se sei passato da un altro software per forum a Discourse utilizzando uno dei nostri script di importazione, allora probabilmente vuoi che tutti i tuoi risultati di ricerca Google guadagnati duramente continuino a puntare allo stesso contenuto. Discourse ha un modo integrato per gestire questo per te come alternativa alla scrittura di regole nginx, utilizzando la tabella di ricerca dei permalink.

La tabella dei permalink ti consente di impostare due cose: un URL da corrispondere e cosa dovrebbe mostrare quell’URL. Ci sono alcune opzioni per definire dove l’URL dovrebbe reindirizzare. Imposta una di queste:

  • topic_id: per mostrare un argomento
  • post_id: per mostrare un post specifico all’interno di un argomento
  • category_id: per mostrare una categoria
  • external_url: per reindirizzare a un URL che potrebbe non appartenere alla tua istanza Discourse

Ad esempio, se gli URL degli argomenti del tuo forum originale fossero simili a http://example.com/discussion/12345, e l’URL di quell’argomento dopo l’importazione fosse http://example.com/t/we-moved/987, allora puoi impostare la mappatura in questo modo:

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

Discourse eseguirà quindi un reindirizzamento con codice di stato HTTP 301 (spostato permanentemente) all’URL corretto per l’ID argomento 12345. Il 301 dovrebbe indurre i motori di ricerca ad aggiornare i loro record e iniziare a utilizzare i nuovi URL.

Se vuoi che alcuni URL reindirizzino fuori da Discourse, puoi farlo impostando external_url:

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

Informazioni aggiuntive

Per trovare l’ID di una sottocategoria, puoi cercarlo tramite lo slug in questo modo:

Category.find_by_slug('products').id

Per eliminare il permalink per quell’URL, fai questo:

Permalink.find_by_url("/blah").destroy

Può esserci un solo record di permalink per URL, quindi cerca semplicemente per URL.

Creazione di una mappa di argomenti da MyBB a Discourse

Domande sul reindirizzamento da Discourse a WordPress

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

Normalizzazione dei Permalink


Ultima revisione di @SaraDev in data 2022-06-03T20:00:00Z

37 Mi Piace

È possibile archiviare la regola di riscrittura direttamente nel cluster Docker di Discourse? C’è un web server che si occupa di http e ssl, posso aggiungere qualcosa lì?

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

Non vedo come possa funzionare dato che nginx non conosce i nuovi ID degli argomenti. Gli ID di /threads devono essere convertiti nell’ID dell’argomento di Discourse.

Se chiamo /threads/name.1234, viene riscritto in /t/name e poi mi mostra il post corretto, l’ID non viene utilizzato in quel momento, l’ho appena testato.

Probabilmente solo quando sei fortunato e Discourse e il tuo vecchio forum generano gli stessi slug (e lo slug non inizia con un numero), ma probabilmente è abbastanza buono.

Se vuoi cambiare NGINX come suggerisci, puoi guardare il template web in discourse_docker per vedere come cambiare la configurazione nginx all’interno del container. Ecco un esempio:

1 Mi Piace

Grazie mille, penso che sarebbe abbastanza una distrazione

devo fare questa modifica con ogni aggiornamento?

No. Lo aggiungerai al tuo app.yml e verrà applicato ad ogni ricompilazione.

Per risparmiare tempo nei test potresti:

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

Quindi usa vim o nano per modificare ciò che vuoi vedere che faccia ciò che pensi (e risparmia 10-20 minuti per ricompilazione). Puoi riavviare nginx con sv restart nginx.

Nessuna delle opzioni precedenti è stata testata, ma dovrebbe essere vicina.

1 Mi Piace

Grazie per l’aiuto, ho modificato la configurazione di nginx e funziona come desiderato.

1 Mi Piace

dove in app.yml deve essere scritto in modo che nginx venga regolato automaticamente? nell’area di esecuzione per i comandi personalizzati?

perché (\u003cunknown\u003e): found unknown escape character while parsing a quoted scalar se aggiungo questo:

  - 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;
      }"

Dai un’occhiata a Imposta Let’s Encrypt con più domini / reindirizzamenti e usa lo stesso tipo di cosa presente in quell’esempio che si aggiunge alla configurazione nginx.

Puoi metterlo nell’hook after_ssl (che aggiungeresti) come in quello.

Ottengo ancora lo stesso errore, penso che abbia a che fare con la formattazione.

1 Mi Piace