El comodín try_files del subdirectorio Nginx siempre falla

El comodín try_files del subdirectorio Nginx siempre falla

Nginx 1.10.3 Ubuntu, instalación apta estándar. index index.php;Ubicado fuera de servermanzana.

Necesito:

  • http://example.com/test/1apuntando a /var/www/example.com/test/1
  • http://example.com/test/2apuntando a /var/www/example.com/test/2

..etcétera.

Como crearé demasiadas pruebas, necesito un comodín para try_files. Actualmente estoy sin comodines:

server {
    server_name example.com;
    root   /var/www/example.com;
    location /test/1/ {
        try_files $uri $uri/ /test/1/index.php?$args;
    }
    location /test/2/ {
        try_files $uri $uri/ /test/2/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

De muchas recomendaciones, ninguna funciona.

PHP simple funciona bien. WordPress y Laravel dieron "Archivo no encontrado":

server {
    server_name example.com;
    location ~ ^/test/(?<content>.+)$ {
        root   /var/www/example.com/test/$content;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Archivo no encontrado:

server {
    server_name example.com;
    location ~ ^/test/(?<content>[^/]+) {
        root   /var/www/example.com/test/$content;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        ...
}

En todos los intentos siguientes, descarga el archivo PHP en lugar de ejecutar PHP:

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /(?<content>[^/]+) {
        try_files $uri $uri/ /$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /(.*)/ {
        try_files $uri $uri/ /$1/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /test/(?<content>[^/]+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /test/(?<content>.+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Si puedo, estoy dispuesto a dar $10 por la respuesta correcta.

Respuesta1

Los bloques de expresión regular locationse evalúan en orden, por lo que el .phpbloque debe colocarse antes del /test/...bloque; de ​​lo contrario, los .phparchivos que se encuentran debajo /test/se descargarán en lugar de ejecutarse. Vereste documentopara detalles.

Tu mejor versión quedó antepenúltima. La expresión regular extrae solo el elemento de ruta que sigue al /test/prefijo.

Simplemente invierta los locationbloques. Por ejemplo:

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ \.php$ {
        ...
    }
    location ~ /test/(?<content>[^/]+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
}

información relacionada