Problemi con i reindirizzamenti dei permalink a causa del frammento dopo "#" non inviato al server

MODIFICA: ho modificato il titolo dell’argomento per riflettere il problema che ho scoperto, grazie alle risposte qui sotto

Sto riscontrando un comportamento strano con i permalink durante il mio lavoro di migrazione.

Il mio problema non riguarda i link interni che non reindirizzano. Sto semplicemente provando incollando gli URL nella barra degli indirizzi del mio browser.

Questi sono i due reindirizzamenti che intendo far avvenire nei miei test:

questo è un reindirizzamento di un post, dovrebbe reindirizzare al secondo post così:

questo è un reindirizzamento di un argomento, dovrebbe andare a:

So che le mie normalizzazioni funzionano correttamente. La mia espressione regolare è

/(?:.*)(\/)(?<topicid>\d*.)-(.[^\/#\?]*)(?<parm>\?(\w*)[=](?<start>\d+))?(?:\/)?(\D+(\/)?)?(?<postid>\d+)?(?:\/)?/normalized.\k<topicid>.\k<postid>

E le verifico nella console rails:

irb(main):069:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs#16249')
=> "normalized.17978.16249"

irb(main):068:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs')
=> "normalized.17978."

Questo è ciò che intendevo. Ho questo nella mia tabella Permalink:

E questo è come appare dal database:

Ma quando inserisco questo nell’URL del browser

viene reindirizzato a

Invece di ciò che dovrebbe essere

Quindi vedo il primo post, ma non scorre al secondo come dovrebbe.

Perché viene aggiunto di nuovo quel hash #16249, se la mia normalizzazione lo ha rimosso?

Un altro modo per evidenziare questa incongruenza (sebbene un po’ artificiale) è provare i seguenti reindirizzamenti dalla barra degli indirizzi del browser:

https://community.suitecrm.com/normalized.17978.
reindirizza correttamente a:
Reports disappeared - 💬 General Discussion - SuiteCRM

E Why two Italian language packs? - #2 by roberto - Translation and Language Packs - SuiteCRM
reindirizza correttamente a
Reports disappeared - #2 by erevodifosin - 💬 General Discussion - SuiteCRM

Quindi perché non funziona quando si segue il processo normale?

I permalink funzionano solo per i link in entrata, è chiaramente indicato nella descrizione.

Dovrai correggere i link interni.

Ho menzionato all’inizio del mio post che non è così: non sto cliccando sui link nei miei stessi forum.

Ma forse non ho capito cosa si intende qui per “link interni”; puoi spiegarlo meglio? Se incollo un URL nella barra degli indirizzi del browser, in che modo questo costituisce un link interno?

L’identificatore di frammento dell’URL (il # e tutto ciò che segue) non viene mai inviato al server dal browser: non è possibile utilizzarlo come parte di un reindirizzamento.

Ora che lo dici, ha senso… ma è piuttosto deprimente.

Immagino che questo escluda completamente i redirect corretti a livello di post dai miei vecchi forum, dato che usano # per quello :sob:

È una limitazione comune che le persone hanno affrontato nelle migrazioni? Questo è il software Kunena, immagino sia piuttosto comune, e scommetto che anche altri usino gli hash per collegare i post…

Ci ho pensato su a lungo. È davvero una limitazione fastidiosa. Immagino che l’errore di base sia stato commesso molto tempo fa dai progettisti dei forum Kunena, nell’utilizzare solo frammenti per contrassegnare i link ai post… sigh.

Vedo tre approcci che Discourse potrebbe adottare per aggirare il problema (sto entrando chiaramente nel territorio del pensiero augurale, godetevi il viaggio)

  1. JavaScript si attiva al caricamento della pagina, riconosce che c’è un frammento hash nell’URI e lo utilizza per chiamare il server e re-indirizzare alla posizione corretta. Funziona, ma si verifica un doppio reindirizzamento e l’utente vede la pagina ricaricarsi.

  2. Discourse potrebbe aggiungere (lato server) un tag id con il vecchio post_id importato a ogni post nell’HTML. In questo modo il browser trasferirebbe il vecchio ID hash e lo utilizzerebbe nella pagina reindirizzata, scorrendo fino in fondo. La principale limitazione: lo scorrimento avanzato di Discourse, dove i post vengono caricati solo quando si scorre fino a essi, rende questo schema insufficiente.

  3. Una combinazione delle due precedenti: Discourse costruisce (lato server) una tabella di corrispondenza tra i vecchi post_id importati e i nuovi post_number, e la invia al client al caricamento della pagina. JavaScript sul client riconosce la presenza di un hash nell’URI, lo traduce utilizzando la tabella e utilizza le proprie funzioni di scorrimento per arrivare al post corretto.

Sarebbe laborioso da implementare e comporterebbe un calo delle prestazioni. Tuttavia, permetterebbe migrazioni perfette…

Queste non sono soluzioni complete perché i reindirizzamenti non funzioneranno comunque a meno che l’utente non sia già su Discourse. I collegamenti esterni hanno molte meno probabilità di arrivare in questo modo.

Il mio approccio attuale per i reindirizzamenti interni/esterni è il seguente:

Il mio vecchio sito si trova all’indirizzo
https://suitecrm.com/suitecrm/forum/, quello nuovo a
https://community.suitecrm.com/

Quando il server migrato va online, eseguiamo un reindirizzamento Gateway dal vecchio al nuovo.

Lascio i miei link interni invariati, iniziando con https://suitecrm.com/suitecrm/forum/. Quando qualcuno ci clicca sopra, è esterno a tutti gli effetti. Ma poi avviene il nostro reindirizzamento Gateway e il traffico torna su Discourse, dove i permalinks dovrebbero attivarsi normalmente.

Giusto? Non l’ho ancora provato… Immagino che sarebbe impossibile se volessimo utilizzare lo stesso nome di dominio e cartella, ma non è il nostro caso.

Ciò che devi fare è utilizzare reindirizzamenti di permalink.

Spesso creo permalink come /oldpost/POST_ID e poi scrivo un reindirizzamento di permalink per riscrivere /forum./category/someslug#1234 in modo che utilizzi quei link.

Per “reindirizzamento permalink” intendi l’impostazione del sito normalizzazioni permalink?

Ops! Sì. Scusa. Era tardi per il mio cervello.

Ok :slight_smile:

Ma sto usando le normalizzazioni dei permalink (vedi il mio primo post). Solo la parte dell’hash non viene mai inviata al server, quindi a meno che non ci sia qualche script JavaScript lato client che faccia la sua magia, non c’è modo che un forum che usa solo hash per i link a livello di post venga mai migrato correttamente (in termini di reindirizzamenti) a Discourse (o a qualsiasi altro software).

Scusa. Non l’ho letto abbastanza attentamente. Pensavo di aver già usato qualcosa dopo l’hash, ma immagino che sia sbagliato. Ricordo un caso recente in cui quegli ID post con l’hash erano presenti, ma immagino che il client volesse solo reindirizzamenti a livello di argomento. Penso che per i 301, arrivare all’argomento corretto sia probabilmente sufficiente,