Problema con i permalink dopo la migrazione

Ciao,

Sono riuscito a migrare con successo un vecchio forum sviluppato in proprio su Discourse.
Dopo l’importazione di 2 milioni di record durata 24 ore, tutto funziona alla perfezione tranne i permalink.

Nel database di Discourse, nella tabella dei permalink, ho circa 350.000 voci, tutte in minuscolo, ad esempio: “forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html”.

Sfortunatamente, Google punta a “/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/” e ricevo un errore 404. :frowning:

Qualche suggerimento su come convertire in minuscolo l’URL della richiesta prima di cercarlo nella tabella dei permalink, senza rompere altro? Non dovrebbe essere una conversione standard da eseguire prima della ricerca?

Grazie per il fantastico software!

Göks

Benvenuto! Complimenti per essere arrivato fin qui!

Credo che tu voglia creare una normalizzazione dei permalink che scarta lo slug e genera permalink contenenti solo l’ID del forum.

Per identificare correttamente l’argomento è sufficiente t140842-s1, giusto?

Esistono altri importatori che fanno questo, anche se non sono sicuro di quali. Forse vBulletin? Ma se li cerchi tutti con grep per la normalizzazione, dovresti trovare il mio esempio.

1 Mi Piace

Grazie per la risposta veloce.

Non sapevo prima della migrazione che la ricerca è sensibile alle maiuscole e minuscole; altrimenti avrei cercato di tenerne conto e assicurarmi che l’URL fosse salvato esattamente come nel vecchio software.

Ma ora sono già post-migrazione e il sito è in produzione. Quindi, purtroppo, sto cercando soluzioni alternative.

Posso identificare un argomento tramite il suo ID, quindi “/forum/t140842” sarebbe sufficiente. Tramite SQL potrei modificare il campo URL nella tabella dei permalink in questo modo, ma verrà comunque eseguita la ricerca e il reindirizzamento? Ho fatto un rapido test e non ha funzionato.

C’è un’opzione per la normalizzazione dei permalink nelle impostazioni di Discourse, ma non ho capito cosa faccia esattamente.

La normalizzazione dei permalink riscriverà l’URL prima che corrisponda al permalink, quindi puoi utilizzarla per rimuovere lo slug. La descrizione nelle impostazioni lo spiega, ma forse solo se lo hai già compreso. :man_shrugging:

I vecchi ID dei topic dovrebbero essere in topicCustomField, quindi dovresti essere in grado di creare nuovi permalink iterandoli. Poi cancella semplicemente quelli vecchi (o cancellali tutti una volta che sei convinto di poter creare quelli che desideri).

Puoi cercare qui e negli altri importatori “permalink” e “normalizzazione” per trovare alcuni esempi (un modo è usare grep -r). Se hai bisogno di ulteriore aiuto e hai un budget, posso aiutarti la prossima settimana.

1 Mi Piace

Ok, quindi ho questa richiesta

https://a3-freunde.de/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor

e una normalizzazione dei permalink nella configurazione come

/t(\d*)/?$forum/t\1

che dovrebbe risultare in “forum/t140842” per la richiesta sopra.

Quando aggiungo l’URL “forum/t140842” alla tabella dei permalink di Discourse, non vedo alcun effetto?
Le mie ipotesi sono corrette? Cosa sto trascurando?

Sei sulla strada giusta. Quelle faccende con le regex possono essere insidiose. Penso che tu debba avere forum/ all’inizio del tuo permalink.

Grazie per lo sforzo. Apprezzo.

Nella configurazione ho modificato la mia regex in (intendo che la mia dovrebbe corrispondere anche all’ID del topic)

forum/t(\d*)/?$forum/t\1

Quando aggiungo un nuovo permalink alla tabella con l’URL “forum/t140842” e lo salvo… Discourse modifica l’URL in “f?$forum/t140842”. O c’è un bug o non capisco il concetto qui.

:confused:

Dopo ulteriori tentativi con la normalizzazione tramite regex, non sono riuscito a capire come funzioni.
L’utilizzo dell’esempio nella descrizione ha causato nuovamente risultati inaspettati nel campo URL quando si aggiungevano nuovi permalink.

Quando ho migrato su Discourse, ho rimosso il prefisso www dal dominio.
Questo mi ha dato l’opportunità di riscrivere l’URI sul vecchio server tramite la configurazione di Apache e il file .htaccess, convertendolo in minuscolo prima di reindirizzarlo al nuovo server Discourse. Questo ha risolto parzialmente il mio problema per il momento.

Non ha funzionato come previsto perché la parte slug dell’URL è stata generata nello script di migrazione in modo leggermente diverso rispetto al vecchio software.

Quindi ho “normalizzato” l’URL da solo.

Aggiungere/generare URL normalizzati (Tabella Permalink di Discourse)

Nel campo URL, trasformare

forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

o
forum/t140842-s2/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

o
forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

in un URL semplice contenente solo l’ID del vecchio argomento:
forum/t140842

Questo viene eseguito tramite un comando SQL che riscrive l’URL utilizzando la funzione REGEXP_REPLACE:

INSERT INTO permalinks (created_at, updated_at, topic_id, url) SELECT NOW(), NOW(), topic_id, REGEXP_REPLACE(url,'forum/t(\d*)(-?.*)/(.*)','forum/t\1','') url FROM permalinks WHERE topic_id > 0 ON CONFLICT DO NOTHING;

Riscrivere le vecchie richieste tramite .htaccess sul vecchio dominio

RewriteRule ^forum/t([0-9]*)(-?.*)/(.*)$ https://discourse-domain.com/forum/t$1 [R=301,L]

Cosa succede qui?

Google ha indicizzato e sta linkando all’URL https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html. Ho avuto la fortuna che questa richiesta fosse gestita da un server Apache a causa di un dominio diverso, permettendomi di utilizzare .htaccess per una riscrittura semplice. Sto quindi riscrivendo questa richiesta in https://discourse-domain.com/forum/t140842. Nella tabella dei permalink ho aggiunto il record forum/t140842 utilizzando il permalink già esistente con l’URL completo contenente lo slug, tramite una regex (vedi sopra).

Spero che questo possa essere d’aiuto ad altri come punto di partenza.

1 Mi Piace