Configuración de reescritura de URL y HAProxy

3 minutos de lectura

Me gustaría preguntar cómo puede ayudar HAProxy a enrutar las solicitudes dependiendo de las partes de la URL.

Para brindarle una descripción general de mi configuración, tengo la máquina HAProxy y los dos backends:

  • Sitio web de IIS (sitio principal)
  • Blog de WordPress sobre NGINX (un subsitio)

El caso de uso:

Espero enrutar las solicitudes según la URL:

  • www.website.com/lang/index.aspx -> sitio principal
  • www.website.com/lang/blog/articlexx -> subsitio del blog

La URL de acceso al blog es “/servidor/blog/lang/articlexx” así que tengo que volver a escribir la solicitud del cliente original a ese formato, que básicamente es cambiar “blog” y “lang”.

Por cómo entendí la documentación de configuración y algunas publicaciones en la red, podría usar reqrep/reqirep para cambiar los encabezados HTTP de solicitud antes de que pasen a un servidor. Y si es así, entonces esta configuración debería funcionar:

frontend vFrontLiner
    bind            x.x.x.x:x
    mode            http
    option          httpclose
    default_backend iis_website

    # the switch: x/lang/blog -? x/blog/lang
    reqirep ^/(.*)/(blog)/(.*) /if\2/\1/\3

    acl blog path_beg -i /lang/blog/

    use_backend blog_website if blog


backend blog_website
    mode    http
    option  httpclose
    cookie  xxblogxx insert indirect nocache
    server  BLOG1 x.x.x.x:80 cookie s1 check inter 5s rise 2 fall 3
    server  BLOG2 x.x.x.x:80 cookie s2 check inter 5s rise 2 fall 3 backup

El problema: Las solicitudes que recibe el backend blog_website siguen siendo la URL original “x/lang/blog”.

Es posible que me haya perdido algo en la parte de expresiones regulares, pero mi principal preocupación es si mi comprensión es correcta o no para usar el reqirep en primer lugar. Apreciaría cualquier ayuda.

Muchas gracias.

  • Después de leer esta entrada, empiezo a darme cuenta de que la solución anterior no es posible. serverfault.com/questions/189916/…

    – Ianthe el Duque de Nukem

    21 de noviembre de 2011 a las 12:40


  • No desea cambiar la URL en función del servidor backend seleccionado por HaProxy. Su cambio se realiza completamente usando use_backend, por lo que el problema es solo la reescritura de la ruta, no el cambio de back-end. La reescritura también se puede hacer en el backend.

    – Tino

    25 de noviembre de 2013 a las 16:02

Su expresión regular es incorrecta, está asumiendo que el servidor está en la ruta de solicitud. Para hacer coincidir las rutas de solicitud en los encabezados, use una expresión regular como esta:

reqrep ^([^\ ]*)\ /lang/blog/(.*) \1\ /blog/lang/\2

también puede usar reqirep, pero eso solo es útil si sus servidores realmente sirven /BLog/lAnG/ también.

  • La expresión regular debe estar en la interfaz con if blog adjunto en el caso anterior, o en el blog_website back-end También debe escribir reqrep ^([^\ :]*)\ /lang/blog/(.*) \1\ /blog/lang/\2 para no coincidir con los encabezados (la diferencia es un :). Y las Cookies no se reescriben en caso de que tengan un path=pero esto es difícil, de todos modos.

    – Tino

    25 de noviembre de 2013 a las 16:04


  • hola @Tino, estoy enfrentando el problema de la ruta de las cookies después de la reescritura de la URL, ¿puedes compartir algún ejemplo sobre cómo lidiar con eso?

    – Thiam Teck

    17 de abril de 2018 a las 7:46

  • @ThiamTeck intentaría algo como http-response replace-value Set-Cookie ;\ path=/blog/lang ;\ path=/lang/blog ver: haproxy.com/documentation/aloha/9-0/traffic-management/… (Nota: creo que esta página pierde algunos ‘\’ en los ejemplos de reemplazo). Pero lo anterior debe adaptarse a sus necesidades, por ejemplo path puede ser solo /blog – Como dije, es difícil. ADVERTENCIA: No lo probé ni lo necesité nunca y todo aquí lo hicieron solo los documentos, no probándolo con HaProxy.

    – Tino

    24 de abril de 2018 a las 5:58


Si esto aún no funciona, cambie a una versión estable, por ejemplo, a partir de ahora reqrep está roto en 1.5 dev. Cambié a 1.4 para arreglarlo.

¿Ha sido útil esta solución?

Configuración de reescritura de URL y HAProxy

3 minutos de lectura

Me gustaría preguntar cómo puede ayudar HAProxy a enrutar las solicitudes dependiendo de las partes de la URL.

Para brindarle una descripción general de mi configuración, tengo la máquina HAProxy y los dos backends:

  • Sitio web de IIS (sitio principal)
  • Blog de WordPress sobre NGINX (un subsitio)

El caso de uso:

Espero enrutar las solicitudes según la URL:

  • www.website.com/lang/index.aspx -> sitio principal
  • www.website.com/lang/blog/articlexx -> subsitio del blog

La URL de acceso al blog es “/servidor/blog/lang/articlexx” así que tengo que volver a escribir la solicitud del cliente original a ese formato, que básicamente es cambiar “blog” y “lang”.

Por cómo entendí la documentación de configuración y algunas publicaciones en la red, podría usar reqrep/reqirep para cambiar los encabezados HTTP de solicitud antes de que pasen a un servidor. Y si es así, entonces esta configuración debería funcionar:

frontend vFrontLiner
    bind            x.x.x.x:x
    mode            http
    option          httpclose
    default_backend iis_website

    # the switch: x/lang/blog -? x/blog/lang
    reqirep ^/(.*)/(blog)/(.*) /if\2/\1/\3

    acl blog path_beg -i /lang/blog/

    use_backend blog_website if blog


backend blog_website
    mode    http
    option  httpclose
    cookie  xxblogxx insert indirect nocache
    server  BLOG1 x.x.x.x:80 cookie s1 check inter 5s rise 2 fall 3
    server  BLOG2 x.x.x.x:80 cookie s2 check inter 5s rise 2 fall 3 backup

El problema: Las solicitudes que recibe el backend blog_website siguen siendo la URL original “x/lang/blog”.

Es posible que me haya perdido algo en la parte de expresiones regulares, pero mi principal preocupación es si mi comprensión es correcta o no para usar el reqirep en primer lugar. Apreciaría cualquier ayuda.

Muchas gracias.

  • Después de leer esta entrada, empiezo a darme cuenta de que la solución anterior no es posible. serverfault.com/questions/189916/…

    – Ianthe el Duque de Nukem

    21 de noviembre de 2011 a las 12:40


  • No desea cambiar la URL en función del servidor backend seleccionado por HaProxy. Su cambio se realiza completamente usando use_backend, por lo que el problema es solo la reescritura de la ruta, no el cambio de back-end. La reescritura también se puede hacer en el backend.

    – Tino

    25 de noviembre de 2013 a las 16:02

Su expresión regular es incorrecta, está asumiendo que el servidor está en la ruta de solicitud. Para hacer coincidir las rutas de solicitud en los encabezados, use una expresión regular como esta:

reqrep ^([^\ ]*)\ /lang/blog/(.*) \1\ /blog/lang/\2

también puede usar reqirep, pero eso solo es útil si sus servidores realmente sirven /BLog/lAnG/ también.

  • La expresión regular debe estar en la interfaz con if blog adjunto en el caso anterior, o en el blog_website back-end También debe escribir reqrep ^([^\ :]*)\ /lang/blog/(.*) \1\ /blog/lang/\2 para no coincidir con los encabezados (la diferencia es un :). Y las Cookies no se reescriben en caso de que tengan un path=pero esto es difícil, de todos modos.

    – Tino

    25 de noviembre de 2013 a las 16:04


  • hola @Tino, estoy enfrentando el problema de la ruta de las cookies después de la reescritura de la URL, ¿puedes compartir algún ejemplo sobre cómo lidiar con eso?

    – Thiam Teck

    17 de abril de 2018 a las 7:46

  • @ThiamTeck intentaría algo como http-response replace-value Set-Cookie ;\ path=/blog/lang ;\ path=/lang/blog ver: haproxy.com/documentation/aloha/9-0/traffic-management/… (Nota: creo que esta página pierde algunos ‘\’ en los ejemplos de reemplazo). Pero lo anterior debe adaptarse a sus necesidades, por ejemplo path puede ser solo /blog – Como dije, es difícil. ADVERTENCIA: No lo probé ni lo necesité nunca y todo aquí lo hicieron solo los documentos, no probándolo con HaProxy.

    – Tino

    24 de abril de 2018 a las 5:58


Si esto aún no funciona, cambie a una versión estable, por ejemplo, a partir de ahora reqrep está roto en 1.5 dev. Cambié a 1.4 para arreglarlo.

¿Ha sido útil esta solución?