Comodín / expresión regular de Nginx en ruta de ubicación

22

La configuración de Nginx que tengo arroja 404 por .phpejemplo:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Sin embargo, tengo algún archivo index.php en la subcarpeta que quiero ejecutar. La configuración actual es como:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

funciona perfectamente, pero el problema son las ubicaciones duplicadas y si hay muchas subpáginas, entonces la configuración se vuelve enorme.

Probé el comodín como * y algunas expresiones regulares, que dicen que la prueba nginx pasó pero no carga la página, es decir, 404. Lo que probé son:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

¿Hay alguna manera de que pueda tener algún nombre de ruta en la ubicación como regex o comodín?


fuente

Respuestas:

32

El =modificador en locationbloque es una coincidencia exacta, sin comodines, coincidencia de prefijos ni expresiones regulares. Por eso no funciona.

En su intento de expresión regular, [a-z]coincide con un solo carácter entre ay z. Por eso no te funciona.

Debe tener sus ubicaciones configuradas de la siguiente manera. Tenga en cuenta el orden de las locationdeclaraciones. nginx selecciona la primera condición de expresión regular coincidente.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Yo uso mayúsculas y minúsculas aquí ( ~modificador en lugar de ~*). En el primer caso, coincido con la primera parte de la ruta, luego uno o más números de caracteres alfabéticos / numéricos y luego index.php. Puede modificar el rango de coincidencia, pero recuerde las +repeticiones de "una o más".

El segundo coincide con cualquier URI que termine en .php. No necesita los caracteres adicionales en su versión debido a la forma en que funcionan las expresiones regulares.

Tero Kilkanen
fuente
gracias, sí, la repetición principal faltaba en la expresión regular. +arreglado.
1

El orden es importante, de la descripción de "ubicación" de nginx :

Para encontrar una ubicación que coincida con una solicitud determinada, nginx primero verifica las ubicaciones definidas utilizando las cadenas de prefijo (ubicaciones de prefijo). Entre ellos, se selecciona y recuerda la ubicación con el prefijo coincidente más largo. Luego se verifican las expresiones regulares, en el orden en que aparecen en el archivo de configuración. La búsqueda de expresiones regulares termina en la primera coincidencia y se utiliza la configuración correspondiente. Si no se encuentra una coincidencia con una expresión regular, se utiliza la configuración de la ubicación del prefijo recordada anteriormente.

Significa:

  • En primer lugar =. (coincidencia "prefijo de coincidencia más largo")
  • Luego los implícitos. (coincidencia "prefijo de coincidencia más largo")
  • Entonces regex. (primer partido)

Necesita ajustar el orden de las partes de expresiones regulares.

Gea-Suan Lin
fuente