2010-07-26 24 views
5

Voglio reindirizzare ogni reindirizzamento 301 post, ma ho oltre 3000 post.Avere un enorme elenco di reindirizzamento in .htaccess a Problem?

Se Ne elenco

Redirect permanent /blog/2010/07/post.html http://new.blog.com/2010/07/23/post/ 
Redirect permanent /blog/2010/07/post1.html http://new.blog.com/2010/07/24/post1/ 
Redirect permanent /blog/2010/07/post2.html http://new.blog.com/2010/07/25/post2/ 
Redirect permanent /blog/2010/07/post3.html http://new.blog.com/2010/07/26/post3/ 
Redirect per...... 

per oltre 3000 URL comando reindirizzare in .htaccess sarebbe questo mangiare il mio risorsa server o causare qualche problema? Non sono sicuro di come .htaccess funzioni, ma se il server sta guardando questi elenchi ogni volta che l'utente richiede una pagina, suppongo che sarà un maiale da risorsa.

Non riesco a utilizzare RedirectMatch perché ho aggiunto la variabile di data nel mio nuovo url. Hai altri suggerimenti per reindirizzare questi post? O sto bene?

Grazie!

+0

404 pagina -> Reindirizza tramite JS. È carino e funziona. – Warty

+6

@ItzWarty: Devo dire che è un consiglio terribile. Non puoi garantire che un vistor abbia attivato JS e non funzioni affatto per gli spider dei motori di ricerca: vedranno il 404 e presumeranno che il tuo contenuto sia semplicemente sparito. Usa sempre i codici di errore per dire cosa significa in realtà il codice. – josh3736

risposta

7

Non sono un esperto di Apache, quindi non posso parlare se avere o meno 3.000 reindirizzamenti in .htaccess è un problema (anche se il mio istinto mi dice che probabilmente è una cattiva idea). Tuttavia, come soluzione più semplice al tuo problema, perché non utilizzare mod_rewrite per eseguire i reindirizzamenti?

RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/$3/ [R=permanent] 

Questo utilizza un'espressione regolare per abbinare i vecchi URL e riscriverli a quelli nuovi. Il [R=permanent] ordina a mod_rewrite di emettere un 301 con il nuovo URL invece di riscrivere silenziosamente la richiesta internamente.

Nel tuo esempio, sembra che tu abbia aggiunto il giorno del post all'URL, che non esiste nel vecchio URL. Dal momento che ovviamente non puoi usare un'espressione regolare per indovinare il giorno in cui è stato fatto un post arbitrario, questo metodo potrebbe non funzionare per te. Se riesci a cancellare il giorno dall'URL, allora sei a posto.

Modifica: La prima volta che ho letto la tua domanda, ho perso l'ultimo paragrafo. ("Non posso usare RedirectMatch perché ho aggiunto la variabile data nel mio nuovo url.") In questo caso, puoi usare il mod_rewrite's RewriteMap per cercare il componente del giorno di un post.

si hanno due opzioni:

  1. utilizzare un HashMap per eseguire ricerche veloci in un file statico. Ciò significa che tutti i tuoi vecchi URL funzioneranno, ma non è possibile accedere a tutti i nuovi post utilizzando il vecchio schema URL.
  2. Utilizzare uno script per afferrare il giorno.

In opzione uno, creare un file chiamato posts.txt e mettere:

/yyyy/mm/pppp dd 

... per ogni post dove YYYY è l'anno del post, mm il mese, ed è pppp il nome del post (senza il .html).

Quando hai finito, eseguire:

$ httxt2dbm -i posts.txt -o posts.map 

Poi aggiungiamo a al/config server virtuale del server: (. Si noti il ​​percorso è un file system percorso , non un URL)

RewriteMap postday dbm:/path/to/file/posts.map 
RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/${postday:$1/$2/$3}/$3/ [R=permanent] 

Nell'opzione 2, utilizzare pgm:/path/to/script/lookup.whatever come RewriteMap. Consulta lo mod_rewrite documentation per ulteriori informazioni sull'utilizzo di uno script.

Fare la ricerca in mod_rewrite è meglio del reindirizzamento a uno script che ricerca la data e quindi reindirizza alla destinazione finale perché you should never redirect more than once. L'emissione di un 301 o 302 comporta un costo di andata e ritorno, che aumenta la latenza del tempo di caricamento della pagina.

+0

Grazie! Proverò alcuni dei vostri suggerimenti. – Maca

+1

Si noti che una 'RewriteMap' non può essere definita in un contesto per directory (' .htaccess'), solo server o server virtuale (può comunque essere usato ovunque). Nel caso in cui la configurazione server/server virtuale non possa essere modificata, un'alternativa simile potrebbe essere quella di riscrivere su uno script che essenzialmente ha la stessa funzione di 'RewriteMap'. Anche +1 per una risposta molto approfondita. –

+0

@Tim: mi è mancato nei documenti. Grazie per segnalarlo; Ho aggiornato la risposta. – josh3736

0

Non è mai una buona idea fare una lista enorme di Redirect. Una tecnica di programmazione migliore consiste semplicemente nel reindirizzare le pagine senza quella variabile data, quindi avere un piccolo snippet PHP che rileva se manca e reindirizza all'URL con esso incluso. La lunga lista sembra appiccicosa e rallenta Apache perché sta controllando quell'URL (qualsiasi altro URL che potrebbe non essere nemmeno influenzato da questo) su ogni riga. Se fossero solo 5 o così, direi bene, ma 3.000 è un NO preciso.

Anche se io non sono un grande fan di questo metodo, un scelta migliore sarebbe quella di reindirizzare tutti gli URL che utilizzano normalmente una singola istruzione partita, riorientandoli alla pagina senza la parte data o con un trattino o qualcosa, quindi includi un piccolo snippet PHP per verificare se la data è valida e, in caso contrario, riscrivi il percorso nuovamente nell'URL correttamente formato.

Onestamente, se prima non avevi quella parte, non ne hai più bisogno, e probabilmente confonderà i motori di ricerca cambiando l'URL per 3000 post. Non hai davvero bisogno di una data nell'URL, un buon titolo è molto più significativo non solo per gli utenti, ma anche per i motori di ricerca, che un sacco di numeri.

1

Se si dispone del codice per determinare il giorno di un post, è possibile generare la riscrittura al volo. Puoi impostare un modello mod_rewrite, qualcosa come .html e impostare uno front controller pattern per calcolare il nuovo url dal vecchio ed emettere l'intestazione 301.

con PHP come esempio:

$_SERVER['REQUEST_URI'] 

conterrà l'URL richiesto e

header("Location: http://new.blog.com/$y/$m/$d/$title/",TRUE,301); 

invierà un reindirizzamento.

1

Questo è ... un sacco di reindirizzamenti. Ma la prima cosa che vorrei dirti, e probabilmente l'unica cosa che posso dirti senza qualificazione, è che dovresti eseguire alcuni test e vedere quali sono i tempi di accesso per il tuo blog, e anche esaminare l'utilizzo della CPU e della memoria del server mentre lo stai facendo Se sono abbastanza bassi anche con quella lista gigante di reindirizzamenti, stai bene finché il tuo blog non subisce un improvviso aumento del traffico. (Sospetto fortemente che le 3000 riscritture rallenteranno molto Apache, però)

Detto questo, vorrei secondo il suggerimento di josh di sostituire i reindirizzamenti con qualcosa di dinamico. Come ha detto animuson, se sei disposto a lasciare il giorno dall'URL, sarà facile impostare una direttiva RewriteRule per gestire il reindirizzamento. Altrimenti, potresti farlo con uno script PHP, o generalmente con qualche codice in qualunque linguaggio di scripting tu (puoi) usare. Se stai utilizzando uno dei popolari motori di blog, probabilmente contiene già del codice per farlo. In pratica si potrebbe fare qualcosa di simile

RewriteRule .* /blog/index.php 

e lasciare che lo script PHP risolvere i quali è stato richiesto posta. Ha accesso al database in modo che sia in grado di farlo e quindi è possibile visualizzare il post direttamente dallo script PHP oppure, per ripristinare il comportamento di reindirizzamento originale, è possibile inviare un'intestazione Location con l'URL corretto.

Un'alternativa sarebbe quella di utilizzare RewriteMap, che permette di scrivere un RewriteRule in cui l'obiettivo è determinata da un programma o un file di vostra scelta, invece di essere direttamente specificato nel file di configurazione. Come opzione, puoi specificare un file di testo che contiene il vecchio e il nuovo URL e Apache gestirà la ricerca del file per la riga appropriata per ogni richiesta specifica. Leggi la documentazione (linkata sopra) per i dettagli completi. Vi dirò che questo non viene usato molto spesso e non sono sicuro di quanto sia più veloce rispetto a avere solo reindirizzamenti 3000.

Ultimo suggerimento: Apache può essere notevolmente più veloce se si è in grado di spostare le direttive di configurazione (come Redirect) nel server o nel file di configurazione dell'host virtuale e disabilitare completamente la lettura di .htaccess. Direi che spostare 3000 direttive da .htaccess nella configurazione dell'host virtuale potrebbe rendere il tuo server considerevolmente più veloce. Ma anche spostare le direttive nel file di configurazione di vhost probabilmente non produrrebbe un aumento della velocità di un singolo RewriteRule.

Problemi correlati