Reindirizzare vecchi URL del forum a nuovi URL di Discourse usando permalink

<div data-theme-toc="true"> </div>

## Reindirizzamento degli URL del vecchio forum ai nuovi URL di Discourse utilizzando i permalink

Se sei passato da un altro software per forum a Discourse utilizzando [uno dei nostri script di importazione](https://github.com/discourse/discourse/tree/main/script/import_scripts), probabilmente vuoi che tutti i tuoi risultati di ricerca Google guadagnati continuino a puntare allo stesso contenuto. Discourse dispone di un modo integrato per gestire questo aspetto come alternativa alla scrittura di regole nginx, utilizzando la **tabella di ricerca permalink**.

La tabella permalink ti consente di impostare due cose: un URL da confrontare e cosa dovrebbe mostrare tale URL. Ci sono alcune opzioni per definire dove deve reindirizzare l'URL. 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
* **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 tua istanza Discourse

Ad esempio, se gli URL degli argomenti del tuo forum originale erano simili a `http://example.com/discussion/12345`, e l'URL per quell'argomento dopo l'importazione è `http://example.com/t/we-moved/987`, puoi configurare 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 di risposta http 301](http://en.wikipedia.org/wiki/HTTP_301) (spostato permanentemente) all'URL corretto per l'ID argomento 12345. Il 301 dovrebbe far sì che i motori di ricerca aggiornino i loro record e inizino a utilizzare i nuovi URL.

Se desideri che alcuni URL reindirizzino lontano 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 cercarla tramite lo slug in questo modo:

Category.find_by_slug(‘products’).id


Per eliminare il permalink per quell'URL, fai così:

Permalink.find_by_url(“/blah”).destroy


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

### Creazione di una mappa degli argomenti da MyBB a Discourse

[quote="Dan Dascalescu, post:21, topic:20930, username:dandv"]
Ho appena creato automaticamente una mappa degli argomenti da MyBB a Discourse, utilizzando lo script di migrazione.

MyBB era impostato per utilizzare URL ottimizzati per i motori di ricerca senza ID al loro interno. Ora, ad esempio, quando navigo su `/thread-foo-bar`, nginx reindirizza a `/t/foo-bar/12`. Ecco come ho fatto:

1. Ho modificato l'importer per generare righe che finiscono per creare un [file di mappatura](https://gist.github.com/dandv/f6476574118d079b9063) da utilizzare per il [modulo map](http://serverfault.com/questions/441235/maintaining-redirects-in-nginx-from-an-external-source/441517#441517) di nginx. Per l'importer MyBB, ho aggiunto questo codice in [`create_posts`](https://github.com/discourse/discourse/blob/9171125954620a5a1b9da128e5a82af22dad916e/script/import_scripts/mybb.rb#L130):

```ruby
parent = topic_lookup_from_imported_post_id(m['first_post_id'])
if parent
  puts "\nXXX #{m['topic_id']}: #{parent[:topic_id]},"
end

Dopo di che, ho cercato le righe che iniziano con XXX, ho rimosso XXX e ho trasformato il file in un oggetto JSON, che ho incollato in questo script. Modifica gli URL per i tuoi forum, esegui lo script e il suo output sarà una serie di righe di mappa nginx. L’ho salvato come /etc/nginx/mybb2discourse.map.
2. Configura nginx per “eseguire altri siti web sulla stessa macchina di Discourse”, apportando le seguenti modifiche al file di configurazione nginx (/etc/nginx/conf.d/discourse.conf) per puntare nginx al file di mappa:

  • inserisci questo all’inizio del file:
map_hash_bucket_size 128;
map_hash_max_size 50000;  # potrebbe essere necessario aumentarlo

map $uri $new {
    include /etc/nginx/mybb2discourse.map;
}
  • quindi, nella sezione server, aggiungi:
if ($new) {
    rewrite ^ $new permanent;
}
  1. Completa i passaggi di ricaricamento di nginx e ricostruzione del container dalla fine del post Configure nginx… collegato sopra.

Sarebbe fantastico se qualcuno più esperto in Ruby potesse modificare l’importer per generare la mappa degli ID argomento (o ancora meglio, la mappa nginx direttamente).
[/quote]

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