Nginx: redireccionamiento basado en parámetros de cadena de consulta

Nginx: redireccionamiento basado en parámetros de cadena de consulta

Tenemos un problema un poco complicado que resolver en nuestra configuración de nginx. Actualmente tenemos un software instalado en la raíz de nuestro documento. Este software utiliza un único punto de entrada (index.php) y cadenas de consulta para mostrar el contenido. Las URL de ejemplo son:

/index.php?forums/forum-name.1
/index.php?threads/thread-name.1
/index.php?users/user-name.1

Etc...

Ahora, moveremos este software a un subdirectorio /f/e instalaremos un nuevo software en la raíz del documento. Este software TAMBIÉN usa index.php (aunque no hay cadenas de consulta). Por lo tanto, debemos idear un conjunto de reglas de reescritura para SÓLO reescribir las URL del software antiguo. Al mismo tiempo, también eliminaremos index.php de las URL. Un conjunto de asignaciones de ejemplo es:

/index.php?forums/forum-name.1 --> /f/forums/forum-name.1
/index.php?threads/thread-name.1 --> /f/threads/thread-name.1
/index.php?users/user-name.1 --> /f/users/user-name.1

Básicamente, necesito redirigir un determinado subconjunto de solicitudes de index.php (que solo contienen ?foros, ?hilos, ?usuarios, etc.), luego eliminar la parte index.php y enviarla al directorio /f/.

He jugado con esto toda la mañana y simplemente no puedo hacerlo funcionar como lo necesito.

Respuesta1

Para gestionar redirecciones complejas, particularmente cuando se trata de cadenas de consulta, mapse puede utilizar la directiva.

No puede hacer coincidir la cadena de consulta (cualquier cosa a partir de ?adelante) en las expresiones locationy rewrite, ya que no es parte del URI normalizado; sin embargo, $request_uricontiene la solicitud original completa con la cadena de consulta.

Hacer coincidir $request_uripuede ser problemático si los parámetros no se envían en un orden coherente; además, los URI que contengan caracteres extraños se codificarán en porcentaje.

La mapdirectiva puede coincidir con cadenas y/o expresiones regulares. Vereste documentopara detalles.

Por ejemplo:

map $request_uri $redirect {
    default                                               0;
    ~*^/index\.php\?(?<suffix>(forums|threads|users).*)$  /f/$suffix;
    ...
}

server {
    ...
    if ($redirect) {
        return 301 $redirect;
    }
    ...
}

Siempre usacapturas nombradasen una mapexpresión regular de bloque. La expresión asignada se evalúa en la returndeclaración. Según tengo entendido, cada vez que nginxencuentro una declaración que contiene unexpresión regular(como rewritealgunos locationbloques y algunas ifdeclaraciones), las capturas numéricas se restablecen. Usandocapturas nombradasgarantiza que permanezcan dentro del alcance en la returndeclaración.

Veresta precauciónsobre el uso de if.

información relacionada