mod_rewrite: sostituisce i caratteri di sottolineatura con i trattini

Sto rivelando la mia imbarazzante ignoranza di REGEX-fu qui, ma: attualmente ho un sito web in cui un carico degli URL degli articoli sono scritti come “article_name”, mentre quelli più recenti sono scritti come “nome-articolo”.

Voglio spostarli tutti utilizzando i trattini, quindi c’è un’espressione regolare che potrei usare per riscrivere gli URL più vecchi ai loro equivalenti più recenti?

Ringraziandola in anticipo!

Innanzitutto devi raggiungere la coerenza negli URL esistenti. Fondamentalmente, devi normalizzare tutti i nomi esistenti per usare sempre i trattini. Ok, l’hai fatto.

Iniziamo con la seguente ipotesi:

L’URL è più o meno della forma:

 http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name

dove devono essere riscritti solo gli URL sotto /articles , e solo la parte /faulty_article_name deve essere disinfettata.

Molto aggiornato, con qualcosa che funziona davvero

Per Apache:

 RewriteEngine On RewriteRule ^(/?articles/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N] RewriteRule ^(/?articles/.*/[^/]*?)_([^/_]*)$ $1-$2 [R=301] 

Questo è generalmente ispirato alla risposta di GApple.

Il primo /? assicura che questo codice venga eseguito su entrambi i file vhost conf e .htaccess . Quest’ultimo non si aspetta un taglio principale.

Quindi aggiungo gli articles/ parte per garantire che le regole si applichino solo agli URL all’interno di /articles .

Quindi, mentre abbiamo almeno due underscore nell’URL, continuiamo a scorrere le regole. Quando finiamo con un solo carattere di sottolineatura rimanente, la seconda regola entra in gioco, la sostituisce con un trattino e esegue un reindirizzamento permanente.

Uff.

Prova questo:

 RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N] RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301] 

La prima regola sostituisce un carattere di sottolineatura alla volta finché non ne rimane uno o meno. L’ultima regola sostituirà quindi l’ultimo undersrore e eseguirà un reindirizzamento esterno.

Un approccio diverso potenziale a cui pensare:

Suppongo che il tuo “vecchio formato” e il tuo “nuovo formato” si troveranno in diverse directory per questa idea, se non lo sono potresti prendere in considerazione l’idea di fare in modo che il nuovo formato abbia un nome di directory diverso.

Per esempio:

  http://site.com/articles/2008/12/31/new_years_celebration 
  http://site.com/article/2008/12/31/new-years-celebration 

In tal caso è ansible utilizzare mod_rewrite per rilevare qualsiasi cosa nella “vecchia directory” e redirect a ” redirector.php “.

Anche se a pensarci bene, il tuo mod_rewrite potrebbe cercare qualcosa del genere:

  RedirectRule /articles/(.*_.*) /redirector.php?article=$1 

Abbinare qualsiasi cosa con un _ e inviarlo attraverso il redirector.

All’interno di redirector.php puoi ottenere $_SERVER['REQUEST_URI'] e utilizzare strumenti come preg_replace e anche query di database per trovare l’url corretto da redirect a – così come studiare il numero di risultati per i vecchi URL.

Ecco un metodo: http://yoast.com/apache-rewrite-dash-underscore/

Fondamentalmente separa l’url in token su entrambi i lati del carattere di sottolineatura e riscrive nuovamente i token con l’underscore sostituito. Il problema è che sostituisce solo un singolo carattere di sottolineatura alla volta; reindirizzerà a un url più vicino ma non del tutto corretto, che reindirizzerà nuovamente a un URL ancora più vicino, ma probabilmente non corretto …

Suggerisce di correggere i reindirizzamenti multipli avendo diverse condizioni di riscrittura e regole con successivamente più caratteri di sottolineatura e token, ma ciò richiederebbe tante condizioni e regole quante sono le sottolineature nel titolo più lungo.

Assicurati di aggiungere qualificatori se puoi, in quanto la regola può sostituire i percorsi che non vuoi modificare (ad es. File di immagini) così come sono.

Come riscriverà la mod saprai quale dovrebbe essere l’url effettivo? È ansible riscrivere tutti gli articoli per utilizzare il carattere di sottolineatura o il trattino, ma non è ansible per mod_rewrite indicare se esiste una nuova posizione.

Per esempio,

 / I_Like_Bees è memorizzato come / percorso / i_like_bees
 / I-come-fiori sono memorizzati come / percorso / i-come-fiori

Vuoi i-like-bees i_like_bees riscrivere in i_like_bees .

  • Se riscrivi i caratteri di sottolineatura in trattini, i_like_bees non verrebbero trovati
  • se si riscrivono i trattini per evidenziare i-like-flowers non verrebbero trovati

Se hai archiviato tutti i tuoi articoli in modo coerente, potresti facilmente far funzionare una regola di riscrittura. Invece, probabilmente devi scrivere uno script per verificare l’esistenza delle directory e fare un reindirizzamento 301 al posto giusto.