es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

nginx multisite reverse proxy utilizando variable de ruta

Tengo configuraciones de multisitio en una sola instancia, me refiero a usar el ID del sitio, estoy cambiando el contenido, el logo, los colores del tema, etc., y tengo diferentes nombres de dominio para cada sitio.

Rutas

http://localhost:3000/{{site_id}}/
http://localhost:3000/{{site_id}}/about-us/
http://localhost:3000/{{site_id}}/product/1232/slug

etc...

Por ejemplo

http://localhost:3000/1 => site-a.local
http://localhost:3000/2 => site-b.local
http://localhost:3000/3 => site-c.local

Estoy usando nginx, un proxy inverso desde el puerto 80 al 3000. ¿Cómo puedo enviar el ID del sitio en nginx?

server {
  listen 80;
  listen [::]:80;
  server_name site-a.local;

  location ~ /(.*) {
    proxy_pass http://localhost:3000/1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

server {
  listen 80;
  listen [::]:80;
  server_name site-b.local;

  location ~ /(.*) {
    proxy_pass http://localhost:3000/2;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

La idea anterior no funciona por alguna razón, ¿alguien puede ayudarme?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para reenviar el id del sitio en la configuración de nginx, puedes usar un grupo de captura regex para extraer el id del sitio de la URL de la solicitud y luego pasarlo como una variable a la directiva proxy_pass. Esto se puede lograr mediante la siguiente configuración:

    server {
       listen 80;
       listen [::]:80;
    
       server_name site-a.local;
    
       location ~ ^/(?<site_id>\d+)(/.*)?$ {
            proxy_pass http://localhost:3000/$site_id$2;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
       }
    }
    
    server {
       listen 80;
       listen [::]:80;
    
       server_name site-b.local;
    
       location ~ ^/(?<site_id>\d+)(/.*)?$ {
            proxy_pass http://localhost:3000/$site_id$2;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
       }
    }
    

    En esta configuración, el patrón regex ^/(?<site_id>\d+)(/.*)?$ coincide con cualquier URL que comience con un id de sitio numérico seguido de segmentos de ruta opcionales. La sintaxis ?<site_id> crea un grupo de captura con nombre que almacena el id del sitio como una variable. La expresión $site_id$2 en la directiva proxy_pass utiliza esta variable para construir la URL objetivo para el proxy inverso, incluyendo cualquier segmento de ruta que haya sido capturado por el regex. Por último, las directivas proxy_set_header establecen varias cabeceras de solicitud para preservar la IP y el protocolo del cliente original.

    Si la configuración anterior no funciona para ti, proporciona más detalles sobre los errores o problemas que estás encontrando y cualquier registro o mensaje de error relevante.

Comments are closed.