¿Cómo eliminar el bloque de ubicación de $ uri en la configuración de nginx?

16

Tengo una reescritura en mi archivo ngix conf que funciona correctamente, excepto que parece incluir el bloque de ubicación como parte de la variable $ uri. Solo quiero la ruta después del bloque de ubicación. Mi código de configuración actual es:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

El uso de una URL de ejemplo de http://localhost/cargo/testpagela redirección funciona, sin embargo, el valor del parámetro "_REWRITE_COMMAND" recibido por mi archivo php es "/ cargo / testpage". Necesito quitar el bloque de ubicación y solo tener "página de prueba" como $ uri

Estoy bastante seguro de que hay una sintaxis de expresiones regulares para dividir $ uri y asignarla a una nueva variable usando $ 1 $ 2, etc., pero no puedo encontrar ningún ejemplo para hacer solo una asignación de variable usando una expresión regular que no sea parte de una reescritura declaración. He estado buscando e intentando durante horas y parece que no puedo superar este último paso.

También sé que podría eliminar esto en el código de la aplicación, pero la razón por la que quiero intentar solucionarlo en nginx conf es por razones de compatibilidad, ya que también se ejecuta en Apache. También debo decir que he descubierto una manera muy hacky para hacerlo, pero se trata de un "if" para comprobar si hay existencia de archivos y la documentación específicamente dice no hacerlo de esa manera.

Jason
fuente

Respuestas:

18

Mirando a mi alrededor, supongo que usar una ubicación regexp con capturas es lo más fácil. Adaptando su ejemplo termino con:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}
La UNI
fuente
¡Ajá, tan simple una vez que alguien te lo señala! Tuve que hacer algunas revisiones menores para manejar la reescritura de la URL raíz en la ubicación correcta. Puse la respuesta en la pregunta ya que no puedo formatear en este comentario. La única advertencia que queda es que el bloque php ahora tiene que estar por encima de este bloque de ubicación o de lo contrario se crea un bucle de redireccionamiento infinito (debido a que / cargo es una expresión regular y la URL de redireccionamiento también contiene / cargo). ¿No está seguro si hay otra manera de evitar que eso suceda?
Jason
Recomiendo leer sobre el pedido de ubicaciones regexp y no regexp. Por lo general, recurro a hacer que todas las ubicaciones regexp en algún momento porque entonces el orden está determinado por el orden en el archivo de configuración en lugar de la especificidad de la coincidencia.
Theuni
genial gracias, me imaginaba que lo que mejoraría la expresión regular anterior sería si coincide con / cargo / (cualquier cosa excepto index.php), entonces eso evitaría un error del servidor debido al bucle de reescritura infinito.
Jason
3

Encontré otra cosa que funcionó para mí (como estoy usando gunicorn, no puedo elegir qué pasar)

Deberías poder salirte con la tuya

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}
g3rv4
fuente
1

Para aquellos que podrían tener dificultades para agregarlo para micro servicio o API con Node JS, utilicé lo siguiente para eliminar apide la url en mi servidor:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
George Mylonas
fuente