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, map
se puede utilizar la directiva.
No puede hacer coincidir la cadena de consulta (cualquier cosa a partir de ?
adelante) en las expresiones location
y rewrite
, ya que no es parte del URI normalizado; sin embargo, $request_uri
contiene la solicitud original completa con la cadena de consulta.
Hacer coincidir $request_uri
puede 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 map
directiva 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 map
expresión regular de bloque. La expresión asignada se evalúa en la return
declaración. Según tengo entendido, cada vez que nginx
encuentro una declaración que contiene unexpresión regular(como rewrite
algunos location
bloques y algunas if
declaraciones), las capturas numéricas se restablecen. Usandocapturas nombradasgarantiza que permanezcan dentro del alcance en la return
declaración.
Veresta precauciónsobre el uso de if
.