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:
- 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.
- 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.
404 pagina -> Reindirizza tramite JS. È carino e funziona. – Warty
@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