Reindirizza i vecchi URL del forum ai nuovi URL di Discourse usando permalink

Reindirizzamento degli URL del vecchio forum a quelli nuovi di Discourse utilizzando i permalink

Se siete passati da altro software per forum a Discourse utilizzando uno dei nostri script di importazione, probabilmente desiderate che tutti i risultati di ricerca di Google guadagnati continuino a puntare allo stesso contenuto. Discourse dispone di un modo integrato per gestire ciò come alternativa alla scrittura di regole nginx, utilizzando la tabella di ricerca dei permalink.

La tabella dei permalink consente di impostare due elementi: un URL da cui effettuare la corrispondenza e ciò che tale URL dovrebbe visualizzare. Ci sono alcune opzioni per definire dove l’URL dovrebbe reindirizzare. Impostate 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
  • tag_id: per mostrare un tag
  • user_id: per mostrare un profilo utente
  • external_url: per reindirizzare a un URL che potrebbe non appartenere alla vostra istanza di Discourse

Ad esempio, se gli URL degli argomenti del vostro forum originale assomigliavano a http://example.com/discussion/12345, e l’URL di quell’argomento dopo l’importazione è http://example.com/t/we-moved/987, potete 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 della risposta 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 a iniziare a utilizzare i nuovi URL.

Se volete che alcuni URL reindirizzino lontano da Discourse, potete farlo impostando external_url:

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

Comportamento importante per i permalink esterni sugli URL degli argomenti

Quando viene creato un permalink external_url per un URL di argomento di Discourse (ad esempio /t/some-slug/123) per reindirizzare a un sito esterno, tenete presente:

  • l’argomento originale deve essere soft-deleted (non hard-deleted)
  • l’argomento deve appartenere a una categoria pubblica

Perché: se l’argomento è ancora attivo, Discourse lo risolve normalmente e la ricerca del permalink non viene utilizzata. Se l’argomento si trova in una categoria privata, i controlli dei permessi possono restituire 404 prima che venga applicato il reindirizzamento del permalink esterno.

Questo è particolarmente rilevante per la navigazione in-app (utenti connessi), dove le rotte possono essere richieste come JSON/XHR.

Informazioni aggiuntive

Per trovare l’ID di una sottocategoria, è possibile cercarla tramite lo slug in questo modo:

Category.find_by_slug('products').id

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

Permalink.find_by_url("/blah").destroy

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

Creazione di una mappa argomenti da MyBB a Discourse

Domande sul reindirizzamento da Discourse a WordPress

Normalizzazione dei permalink


Ultima revisione da @SaraDev il 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