Apache: ¿Cuál es la mejor manera de manejar miles de redireccionamientos permanentes?

20

Tenemos una lista de 3000 301 redirecciones. Necesitamos asistencia en

  1. ¿Cuál sería el mejor lugar para poner estos? Parece que poner estas 3000 líneas dentro de vhost en httpd.conf sería un desastre.
  2. ¿Cuáles son las formas recomendadas para manejar miles de URL?
  3. ¿Cuánto afectará la velocidad de carga de la página y la carga del servidor Apache?

Gracias.

ucker
fuente

Respuestas:

29

Puede usar la Includedirectiva httpd.confpara poder mantener las redirecciones en otro archivo. Pero no sería muy eficiente, ya que cada solicitud debería verificarse con muchas expresiones regulares. También sería necesario reiniciar el servidor después de cada cambio en el archivo.

Una mejor manera para tantos redireccionamientos sería utilizar la directiva de tipo RewriteMapdbm para declarar un mapa desde los URI a los redireccionamientos. De esta manera, será eficiente, ya que las búsquedas de dbm son muy rápidas y, después de un cambio en el mapa, no necesitará reiniciar un servidor, ya que httpdverifica el tiempo de modificación del archivo del mapa.

Las reglas de reescritura se verían así (probado en mi computadora Fedora 16):

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

Y el mapa dbm se crearía a partir del mapa de texto /etc/httpd/conf/redirects.txtcon este aspecto:

/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
Tometzky
fuente
Gracias por la respuesta. Lo intenté pero obtengo errores: mi línea redirige.txt contenido del archivo (valores separados por espacios) mydomain.com/experiment mydomain.com/new_page Me dio un error de análisis en la línea 'RewriteCond $ {redirects: $ 1}! = ""' . Error de sintaxis en la línea 314 de /usr/local/apache/conf/httpd.conf: RewriteCond: delimitadores de bandera incorrectos Lo comenté y luego apache comenzó pero al visitar mydomain.com/experiment (o cualquier otra url de mydomain) me dio un error "la solicitud se está redirigiendo de una manera que no se pudo completar".
ucker
Apache no se reinicia con el fragmento anterior. ¿Podrias ayudarme por favor? No puedo ver ningún error relacionado con esto en ninguno de los archivos de registro.
ucker
Dije que no había sido probado, esperaba que necesitaría algunos ajustes. Pensé que sería suficiente, lo siento. Httpd no se inició ya que no puede haber un espacio entre !=y ahora ""he corregido mi ejemplo a una versión funcional y probada.
Tometzky
Un comentario más: necesitaría usar un enfoque diferente si sus redirecciones deben depender de las cadenas de consulta (todo después ?en la URL), pero también es posible . Como es ahora, simplemente agregaría una cadena de consulta para redirigir, por ejemplo http://yourserver.com/foo?q=bar, redirigiría a http://serverfault.com/?q=bar.
Tometzky
Gracias por la actualización. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbdio error RewriteMap dbm type db is invalid. Pero cuando lo usé RewriteMap redirects txt:/etc/httpd/conf/redirects.txtfuncionó. Todavía quiero ir de manera hash como explicaste en lugar de texto sin formato. Pero no pude encontrar mucho sobre el error dbm. Gracias por tu ayuda.
ucker
2

Escribiría un script que genera un nuevo VHOST con solo los enlaces de la lista.

Lucas Kauffman
fuente