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.

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.