Questo riferimento spiega come i permalink di Discourse reindirizzino i vecchi percorsi URL verso nuove destinazioni, come funzionano le normalizzazioni dei permalink e come testare e risolvere i problemi di reindirizzamento dopo una migrazione o una modifica della struttura degli URL.
Livello utente richiesto: Amministratore
L’accesso alla console è richiesto solo quando si creano permalink da un importer, uno script o la console Rails
Quando si migra da un altro forum o si modifica la struttura degli URL del sito, i vecchi link provenienti da motori di ricerca, segnalibri, email o altri siti web potrebbero non puntare più alla pagina corretta.
I permalink consentono di reindirizzare i vecchi percorsi URL verso le nuove destinazioni utilizzando reindirizzamenti 301 Moved Permanently.
I permalink sono mappature esatte dei percorsi. Ad esempio, se questo vecchio URL non funziona più:
https://discourse.example.com/forum/topic/123
puoi creare un permalink in modo che reindirizzi al nuovo argomento:
https://discourse.example.com/t/welcome-to-our-community/456
Cosa sono i permalink
Un permalink è una mappatura esatta da un vecchio percorso URL a una nuova destinazione.
Ad esempio:
forum/topic/123 → /t/welcome-to-our-community/456
I permalink sono utili quando:
- hai migrato da un’altra piattaforma di forum
- i vecchi link sono indicizzati dai motori di ricerca
- i vecchi link vengono utilizzati in email, documentazione o altri siti web
- hai modificato la struttura degli URL del tuo sito
- desideri che un vecchio percorso reindirizzi a un argomento, un post, una categoria, un tag, un utente o un URL esterno
Ogni URL del permalink mappa una sola destinazione.
I permalink sono corrispondenze esatte. Il campo dell’URL del permalink non supporta caratteri jolly o espressioni regolari. Se molti vecchi URL seguono un modello prevedibile, utilizza le normalizzazioni dei permalink per trasformare gli URL in arrivo prima della ricerca del permalink esatto.
Permalink e normalizzazioni
I permalink e le normalizzazioni svolgono funzioni diverse:
| Funzionalità | Cosa fa | Esempio |
|---|---|---|
| Permalink | Reindirizza un vecchio percorso salvato a una destinazione | vecchio/topic/123 → Argomento 456 |
| Normalizzazione | Modifica il percorso in arrivo prima della ricerca del permalink | vecchio/topic/123-titolo → vecchio/topic/123 |
Una normalizzazione non reindirizza di per sé. Modifica solo il percorso utilizzato per cercare un permalink salvato.
È comunque necessario disporre di un permalink corrispondente dopo che la normalizzazione è stata applicata.
Esempi rapidi
Reindirizza un vecchio URL di un argomento
URL vecchio:
https://discourse.example.com/forum/topic/123
URL del permalink:
forum/topic/123
Tipo di destinazione:
Argomento
Destinazione:
456
Risultato:
/forum/topic/123 → /t/welcome-to-our-community/456
Reindirizza un vecchio URL con una stringa di query
URL vecchio:
https://discourse.example.com/viewtopic.php?t=123
URL del permalink:
viewtopic.php?t=123
Tipo di destinazione:
Argomento
Destinazione:
456
Risultato:
/viewtopic.php?t=123 → /t/welcome-to-our-community/456
Reindirizza molti vecchi URL con lo stesso modello
URL vecchi:
/forum/support/123-how-do-i-reset-my-password.html
/forum/general/456-how-do-i-change-my-email.html
Puoi utilizzare una normalizzazione per semplificarli prima della ricerca:
/forum/support/123-how-do-i-reset-my-password.html → forum/123
/forum/general/456-how-do-i-change-my-email.html → forum/456
Quindi crea permalink esatti:
forum/123 → Argomento 1001
forum/456 → Argomento 1002
Cosa inserire come URL del permalink
Inserisci il vecchio percorso, non l’URL completo.
Ad esempio, usa:
forum/topic/123
oppure:
/forum/topic/123
Non utilizzare l’URL vecchio completo:
https://discourse.example.com/forum/topic/123
Le barre iniziali sono accettate, ma vengono rimosse quando il permalink viene salvato. Queste due voci sono equivalenti:
/forum/topic/123
forum/topic/123
Entrambe vengono memorizzate come:
forum/topic/123
Gli spazi iniziali e finali vengono rimossi quando il permalink viene salvato.
Le stringhe di query fanno parte della corrispondenza
I permalink corrispondono all’intero percorso della richiesta, inclusa la stringa di query.
Questo significa che questi due URL sono corrispondenze di permalink diverse:
/vecchio/topic/123
/vecchio/topic/123?utm_source=esempio
Se il vecchio URL ha una stringa di query, devi:
- creare un permalink che includa la stringa di query, oppure
- utilizzare una normalizzazione del permalink per rimuovere o semplificare la stringa di query prima della corrispondenza
Per la maggior parte dei parametri di analisi o tracciamento, l’utilizzo di una normalizzazione è solitamente migliore rispetto alla creazione di molti permalink separati.
Ad esempio, questo permalink salvato:
docs/123
non corrisponde necessariamente a questo URL richiesto:
/docs/123?utm_source=newsletter
a meno che una normalizzazione non rimuova la stringa di query prima della ricerca.
Quando copi vecchi URL dagli strumenti di analisi, dai rapporti della console di ricerca, dai browser o dalle campagne email, verifica se sono stati aggiunti parametri di tracciamento.
I frammenti URL non fanno parte della corrispondenza
I frammenti URL non vengono inviati al server.
Ad esempio, questo URL:
/vecchio/topic#post-12
arriva al server come:
/vecchio/topic
Un permalink o una normalizzazione non può corrispondere a:
#post-12
a meno che il carattere # non sia codificato nella richiesta effettiva come %23.
Destinazioni dei permalink supportate
Un permalink può reindirizzare a uno di questi tipi di destinazione:
- Argomento
- Post
- Categoria
- Tag
- Utente
- URL esterno o relativo
Le destinazioni URL esterne o relative possono essere utilizzate per reindirizzamenti come:
vecchio/privacy-policy → https://archive.discourse.example.com/privacy
oppure:
vecchio/preferenze → /miei/preferenze
Utilizza le destinazioni URL esterne con cautela. Reindirizzano i visitatori fuori dal tuo sito e non verificano se l’URL di destinazione esiste.
Preferisci i tipi di destinazione interni quando reindirizzi ad argomenti, post, categorie, tag o utenti migrati. Utilizza una destinazione URL esterna quando la pagina di destinazione non è rappresentata da un oggetto interno.
Aggiungi un permalink manualmente
Per aggiungere un permalink manualmente:
- Vai a
/admin/config/permalinks. - Seleziona la scheda Permalink.
- Clicca su Aggiungi permalink.
- Inserisci il vecchio percorso nel campo URL.
- Seleziona il Tipo di permalink.
- Inserisci o seleziona la destinazione.
- Salva il permalink.
- Testa il vecchio URL in un browser o con
curl.
Esempio:
URL:
forum/topic/123
Tipo di permalink:
Argomento
Destinazione:
456
Una richiesta a:
https://discourse.example.com/forum/topic/123
reindirizzerà all’argomento 456.
Valori di destinazione
Il valore di destinazione dipende dal tipo di permalink.
| Tipo di permalink | Destinazione |
|---|---|
| Argomento | Un argomento |
| Post | Un post |
| Categoria | Una categoria |
| Tag | Un tag |
| Utente | Un utente |
| URL esterno o relativo | Un URL esterno completo o un percorso relativo |
Esempi:
forum/topic/123 → Argomento 456
forum/post/789 → Post 789
forum/category/support → Categoria supporto
forum/tag/example → Tag example
forum/user/alice → Utente alice
vecchio/privacy → https://archive.discourse.example.com/privacy
vecchio/preferenze → /miei/preferenze
Creazione di permalink durante una migrazione
Molti importer ufficiali creano automaticamente i permalink per le categorie, gli argomenti, i post o gli utenti migrati.
Per le migrazioni di grandi dimensioni, i permalink vengono solitamente creati dall’importer o da uno script di migrazione anziché inseriti manualmente uno alla volta.
Se stai scrivendo un importer personalizzato, crea record di permalink per i vecchi URL che devono continuare a funzionare dopo la migrazione.
Ad esempio:
Permalink.create!(url: "discussion/12345", topic_id: 987)
In questo esempio, discussion/12345 è il vecchio percorso e 987 è l’ID dell’argomento Discourse.
È accettata anche una barra iniziale:
Permalink.create!(url: "/discussion/12345", topic_id: 987)
Entrambi gli esempi memorizzano l’URL del permalink come:
discussion/12345
Per reindirizzare a un URL esterno:
Permalink.create!(
url: "discussion/12345",
external_url: "https://archive.discourse.example.com/discussion/12345"
)
Quando crei permalink in un importer:
- memorizza il vecchio percorso, non il vecchio dominio completo
- includi la stringa di query solo se è necessaria per la corrispondenza
- assicurati che ogni vecchio percorso mappi una sola destinazione
- verifica la presenza di duplicati prima di inserire i record
- ricorda che gli URL dei permalink devono essere unici
Se esegui più migrazioni di test, gli ID finali degli argomenti e dei post potrebbero cambiare tra un’esecuzione e l’altra. Genera o verifica le tue mappature dei permalink finali quando i dati di migrazione in produzione sono stabili.
Cosa sono le normalizzazioni dei permalink
Una normalizzazione del permalink modifica un vecchio percorso in arrivo prima di cercare un permalink corrispondente.
Le normalizzazioni sono utili quando molti vecchi URL seguono lo stesso modello prevedibile.
Ad esempio, supponi che il tuo vecchio forum utilizzasse URL come questo:
/forum/support/123-how-do-i-reset-my-password.html
ma il tuo permalink salvato è più semplice:
forum/123
Una normalizzazione può trasformare la richiesta in arrivo nel percorso del permalink salvato:
/forum/support/123-how-do-i-reset-my-password.html
↓
forum/123
Quindi il permalink può reindirizzare:
forum/123 → /t/how-do-i-reset-my-password/456
Una normalizzazione non reindirizza di per sé. Modifica solo il percorso utilizzato per la ricerca del permalink.
È comunque necessario disporre di un permalink corrispondente per il percorso normalizzato.
La maggior parte dei siti non ha bisogno di normalizzazioni dei permalink. Utilizzale solo quando molti vecchi URL seguono un modello prevedibile e la creazione di un permalink per ogni vecchio URL sarebbe impraticabile.
Come funzionano insieme i permalink e le normalizzazioni
Quando viene richiesta un vecchio URL, il processo è:
Il visitatore richiede il vecchio URL
↓
Vengono applicate le normalizzazioni dei permalink, se configurate
↓
Viene eseguita una ricerca del permalink utilizzando il percorso risultante
↓
Se esiste un permalink corrispondente, il visitatore viene reindirizzato
Ad esempio:
URL richiesto:
/vecchio/topic/123?utm_source=newsletter
La normalizzazione lo cambia in:
vecchio/topic/123
Il permalink lo reindirizza a:
/t/titolo-nuovo-argomento/456
Aggiungi una normalizzazione del permalink
Le normalizzazioni dei permalink sono configurate dalle impostazioni dei permalink.
Per aggiungerne una:
- Vai a
/admin/config/permalinks. - Seleziona la scheda Impostazioni.
- Aggiungi una regola all’impostazione
permalink normalizations. - Salva l’impostazione.
- Testa un vecchio URL che dovrebbe essere normalizzato.
- Conferma che il percorso normalizzato corrisponda a un permalink esistente.
La sintassi è:
/<regex>/<replacement>
Più regole sono separate da |.
Ad esempio:
/old\/topic\/(\d+).*/topic/\1
Questo può trasformare:
vecchio/topic/123-mio-vecchio-titolo
in:
topic/123
La sostituzione utilizza la sintassi di sostituzione Ruby, quindi i gruppi di cattura sono scritti come:
\1
\2
\3
Regole importanti per le normalizzazioni
Mantieni semplici le regole di normalizzazione.
- Le normalizzazioni utilizzano espressioni regolari Ruby.
- I caratteri
/letterali nella parte regex devono essere escapati come\/. - I caratteri
/letterali nella parte di sostituzione non devono essere escapati. - Più regole di normalizzazione sono separate da
|. - Poiché
|separa le regole, evita di utilizzare l’alternanza regex con|. - Ogni regola utilizza una singola sostituzione, non una sostituzione globale.
- Le regole vengono applicate in ordine.
- Le regole corrispondenti vengono applicate in sequenza.
- Le normalizzazioni vengono applicate prima della ricerca del permalink.
- Le normalizzazioni vengono applicate anche quando si salvano i record dei permalink.
- Il validatore delle impostazioni rileva le espressioni regolari non valide, ma potrebbe non rilevare ogni regola che si comporta in modo diverso da quanto previsto.
Attenzione: Le normalizzazioni vengono applicate quando i record dei permalink vengono salvati. Se inserisci un URL non normalizzato nell’interfaccia di amministrazione, potrebbe essere memorizzato come risultato normalizzato. Se aggiungi o modifichi le normalizzazioni dopo aver creato i permalink, testa attentamente e verifica come vengono memorizzati i nuovi URL dei permalink salvati.
Esempi di normalizzazione
Reindirizza un vecchio URL con testo del titolo aggiuntivo
URL vecchi:
/forum/support/123-how-do-i-reset-my-password.html
/forum/general/456-how-do-i-change-my-email.html
Puoi normalizzarli in percorsi di permalink più semplici:
forum/123
forum/456
Esempio di normalizzazione:
/forum\/[^\/]+\/(\d+).*/forum/\1
Quindi crea i permalink:
forum/123 → Argomento 1001
forum/456 → Argomento 1002
Ignora le stringhe di query di tracciamento
URL vecchio richiesto:
/docs/123?utm_source=newsletter
Permalink salvato:
docs/123
Normalizzazione:
/(docs\/\d+)\?.*/\1
Questo rimuove la stringa di query prima della ricerca del permalink.
Preserva un parametro di query importante
Alcuni vecchi forum utilizzano i parametri di query come identificatore stabile dell’argomento.
Ad esempio:
viewtopic.php?f=10&t=123
viewtopic.php?t=123
Potresti voler normalizzare questi URL in:
viewtopic.php?t=123
Esempio di normalizzazione:
/(viewtopic\.php\?)(?:.*&)?(t=\d+).*/\1\2
Quindi crea un permalink:
viewtopic.php?t=123 → Argomento 456
Reindirizzamenti Regex e wildcard
Il campo dell’URL del permalink non supporta regex o wildcard.
Questo non funzionerà come URL del permalink:
forum/topic/*
Questo non funzionerà nemmeno come URL del permalink:
forum/topic/(\d+)
Se hai bisogno di una gestione basata su modelli, utilizza una normalizzazione del permalink per riscrivere l’URL in arrivo in una forma che possa corrispondere a un permalink salvato esatto.
Ad esempio:
/forum/topic/123-titolo → forum/topic/123
Quindi crea un permalink esatto normale:
forum/topic/123 → Argomento 456
Precedenza dei route e percorsi integrati
Il routing dei permalink viene verificato dopo i route delle applicazioni normali.
Questo significa che un route esistente valido potrebbe essere risolto normalmente prima che venga verificato un permalink.
Fai attenzione con i vecchi URL che iniziano con percorsi integrati come:
/t
/c
/u
/tag
/tags
Ad esempio, un vecchio URL di forum come questo potrebbe sembrare un route di categoria integrato:
/c/blog/vecchio-url-piattaforma/ba-p/12345
Se un vecchio URL entra in conflitto con un route esistente valido, il route valido può avere la precedenza sul permalink.
Allo stesso modo, se crei un permalink per un percorso che sembra un route di argomento esistente, come:
t/123
il route normale dell’argomento potrebbe essere gestito prima della ricerca del permalink.
Alcuni route integrati “non trovato” hanno un comportamento di fallback aggiuntivo, ma non dovresti farvi affidamento. Testa sempre i vecchi URL che si sovrappongono ai percorsi integrati.
Se hai bisogno che un vecchio URL di un argomento reindirizzi da qualche altra parte, il vecchio argomento generalmente non deve continuare a risolversi come un route di argomento valido.
Permessi e contenuti privati
I permalink verso destinazioni interne rispettano i normali permessi.
Se un permalink punta a un argomento, post, categoria, tag o utente privato o limitato, i visitatori che non possono accedere a quella destinazione riceveranno un 404 invece di un reindirizzamento.
I permalink verso URL esterni non verificano i permessi dei contenuti interni.
Caratteri speciali e URL codificati
Testa attentamente gli URL con caratteri speciali.
Questo include URL con:
- spazi
+%&':- parentesi
- caratteri non latini
La corrispondenza dei permalink utilizza il percorso della richiesta codificato dopo aver rimosso la barra iniziale e aver applicato le normalizzazioni configurate. Le differenze di codifica possono impedire a un URL di corrispondere al permalink previsto.
Ad esempio, questi potrebbero non essere equivalenti a seconda di come il vecchio URL viene richiesto e memorizzato:
vecchio/topic/hello%20world
vecchio/topic/hello+world
Utilizza %20 per gli spazi negli esempi di URL. In un percorso URL, + non è uguale a uno spazio.
Caratteri come &, ? e # hanno un significato speciale negli URL. Se sono intesi come caratteri di percorso letterali, devono essere codificati in percentuale.
In caso di dubbi, testa l’esatto vecchio URL che gli utenti o i motori di ricerca richiederanno.
Limitazioni
I permalink sono progettati per reindirizzare vecchi percorsi verso nuove destinazioni. Non sono un motore di reindirizzamento o riscrittura a uso generale.
Limitazioni importanti:
- Gli URL dei permalink sono memorizzati come percorsi e stringhe di query, non come URL completi.
- Gli URL completi non vengono convertiti automaticamente in percorsi.
- Gli URL dei permalink devono essere unici dopo la normalizzazione.
- Un URL del permalink può avere una sola destinazione.
- Le destinazioni supportate sono limitate ad argomenti, post, categorie, tag, utenti e URL esterni o relativi.
- I permalink utilizzano
301 Moved Permanently; non esiste un’opzione per302per singolo permalink. - Il campo dell’URL del permalink non supporta caratteri jolly o espressioni regolari.
- Le stringhe di query fanno parte della chiave di ricerca.
- I frammenti URL, come
#post-12, non vengono inviati al server e non possono essere corrispondenti. - La corrispondenza non utilizza lo schema o l’host della richiesta.
- I route nativi vengono verificati prima del route catch-all dei permalink.
- Le destinazioni interne sono verificate per i permessi.
- Le destinazioni URL esterne bypassano i controlli dei permessi dei contenuti interni.
- Le normalizzazioni dei permalink utilizzano espressioni regolari Ruby.
- Le regole di normalizzazione sono separate da
|, quindi evita di utilizzare|come alternanza regex. - Le regole di normalizzazione utilizzano una singola sostituzione per regola, non una sostituzione globale.
- Le normalizzazioni vengono applicate sia prima della ricerca che prima del salvataggio dei record dei permalink.
- Il validatore delle impostazioni rileva le espressioni regolari non valide, ma potrebbe non rilevare ogni regola che si comporta in modo diverso da quanto previsto.
Per la maggior parte dei siti, i semplici permalink uno-a-uno sono più facili da mantenere rispetto alle complesse regole di normalizzazione. Utilizza le normalizzazioni solo quando i vecchi URL seguono un modello prevedibile.
Evita di reindirizzare ogni vecchio URL alla homepage
Non reindirizzare tutti i vecchi URL alla tua homepage.
Reindirizza ogni vecchio URL alla nuova pagina più pertinente. Se non esiste un contenuto equivalente, un 404 potrebbe essere meglio che inviare utenti e motori di ricerca a una pagina non correlata.
I buoni reindirizzamenti sono specifici:
vecchio/topic/123 → nuovo argomento sullo stesso argomento
I reindirizzamenti scadenti sono generici:
vecchio/topic/123 → homepage
vecchio/topic/456 → homepage
vecchio/topic/789 → homepage
Testa i tuoi reindirizzamenti
Dopo aver creato permalink o normalizzazioni, testa un campione di vecchi URL.
Puoi testare in un browser, oppure utilizzare:
curl -I https://discourse.example.com/forum/topic/123
Un reindirizzamento del permalink funzionante dovrebbe restituire un reindirizzamento permanente simile a:
HTTP/2 301
location: https://discourse.example.com/t/welcome-to-our-community/456
Testa gli esempi da ogni modello di vecchio URL, inclusi:
- vecchi URL degli argomenti
- vecchi URL delle categorie
- vecchi URL dei post
- URL con stringhe di query
- URL con caratteri speciali
- URL dai risultati di ricerca
- URL da vecchie email o documentazione
- URL che iniziano con percorsi integrati come
/t,/co/u - reindirizzamenti URL esterni
Risoluzione dei problemi
Se un vecchio URL non viene reindirizzato, verifica queste cause comuni:
- Conferma che il permalink esista.
- Conferma che l’URL del permalink sia il vecchio percorso, non il vecchio dominio completo.
- Verifica se il vecchio URL include una stringa di query.
- Se utilizzi una normalizzazione, conferma che il percorso normalizzato corrisponda a un permalink salvato.
- Verifica se un route integrato ha la precedenza.
- Verifica se la destinazione è privata o limitata.
- Verifica le differenze di codifica, come
%20vs+. - Verifica se una normalizzazione ha modificato l’URL quando il permalink è stato salvato.
- Conferma che il contenuto sia stato migrato.
- Testa con l’esatto vecchio URL da un browser o con
curl -I.
I problemi più comuni sono:
- inserimento dell’URL vecchio completo invece del vecchio percorso
- stringhe di query mancanti o impreviste
- aspettarsi che i caratteri jolly o le regex funzionino nel campo dell’URL del permalink
- vecchi URL che si sovrappongono ai percorsi integrati
- destinazioni private o limitate
- differenze di codifica
- normalizzazioni che modificano il percorso in modo imprevisto
Note SEO
Dopo una migrazione, i motori di ricerca potrebbero segnalare i vecchi URL come reindirizzati. Questo è previsto se quei vecchi URL ora reindirizzano alle nuove pagine corrette.
Per ottenere i migliori risultati:
- reindirizza i vecchi URL alle nuove pagine pertinenti
- evita catene di reindirizzamento non necessarie
- evita di reindirizzare molti URL non correlati alla homepage
- mantieni i reindirizzamenti attivi abbastanza a lungo affinché utenti e motori di ricerca possano aggiornarsi
- testa gli URL importanti dai dati della tua vecchia sitemap, analytics o console di ricerca