Apache: qual è il modo migliore per gestire migliaia di reindirizzamenti permanenti?


20

Abbiamo un elenco di 3000 reindirizzamenti 301 301. Abbiamo bisogno di assistenza

  1. Quale sarebbe il posto migliore dove metterli? Sembra che mettere queste 3000 righe all'interno del vhost in httpd.conf sarebbe un casino.
  2. Quali sono i modi consigliati per gestire migliaia di URL?
  3. Quanto influirà sulla velocità di caricamento della pagina e sul carico del server apache?

Grazie.

Risposte:


29

È possibile utilizzare la Includedirettiva in httpd.confper essere in grado di mantenere i reindirizzamenti in un altro file. Ma non sarebbe molto efficiente, poiché ogni richiesta dovrebbe essere verificata rispetto a molte espressioni regolari. Inoltre, dopo ogni modifica nel file sarebbe necessario un riavvio del server.

Un modo migliore per così tanti reindirizzamenti sarebbe usare la direttiva di tipo RewriteMapdbm per dichiarare una mappa dagli URI ai reindirizzamenti. In questo modo sarà efficiente, poiché le ricerche di dbm sono molto veloci e dopo una modifica della mappa non sarà necessario riavviare un server, poiché httpdcontrolla i tempi di modifica del file della mappa.

Una regola di riscrittura sarebbe simile a questa (testata sul mio computer Fedora 16):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

E la mappa dbm verrebbe creata dalla mappa di testo in /etc/httpd/conf/redirects.txtquesto modo:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

usando un comando

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db

Grazie per la risposta. L'ho provato ma ho riscontrato degli errori: il mio contenuto del file redirects.txt su una riga (valori separati da spazio) mydomain.com/experiment mydomain.com/new_page Mi ha dato l'errore di analisi sulla riga 'RewriteCond $ {redirects: $ 1}! = ""' . Errore di sintassi sulla riga 314 di /usr/local/apache/conf/httpd.conf: RewriteCond: delimitatori di flag non validi Ho commentato che fuori e quindi apache è iniziato ma visitando mydomain.com/experiment (o qualsiasi altro URL da miodominio) mi ha dato l'errore "la richiesta viene reindirizzata in modo da non poter essere completata".
Ucker

Apache non si riavvia con lo snippet precedente. Potresti aiutarmi, per favore? Non riesco a vedere alcun errore correlato a questo in nessuno dei file di registro.
Ucker

Ho detto che non era stato testato - mi aspettavo che avrebbe avuto bisogno di qualche modifica. Ho pensato che sarebbe bastato, scusa. Httpd non è stato avviato in quanto non può esserci uno spazio tra !=e ""- Ho corretto il mio esempio per una versione funzionante e testata ora.
Tometzky,

Un altro commento: dovrai utilizzare un approccio diverso se i reindirizzamenti devono dipendere dalle stringhe di query (tutto dopo ?nell'URL), ma è anche possibile . Come è ora, aggiungerebbe semplicemente la stringa di query al reindirizzamento, ad esempio http://yourserver.com/foo?q=barreindirizzerebbe a http://serverfault.com/?q=bar.
Tometzky,

Grazie per l'aggiornamento. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbha dato errore RewriteMap dbm type db is invalid. Ma quando l'ho usato RewriteMap redirects txt:/etc/httpd/conf/redirects.txtha funzionato. Voglio ancora seguire l'hash hash come hai spiegato invece del semplice testo. Ma non sono riuscito a trovare molto sull'errore dbm. Grazie per l'aiuto.
Ucker

2

Scriverei uno script che genera un nuovo VHOST con solo i collegamenti dall'elenco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.