Cómo servir archivos php desde una carpeta fuera de la carpeta raíz web en nginx

Cómo servir archivos php desde una carpeta fuera de la carpeta raíz web en nginx

Cuando voy a la URL, www.example.grquiero cargar un formulario al que pueda enviarlo www.example.gr/php/mail.php.

La estructura de mis archivos y carpetas es así.

root folder ( /var/www/html/app/ ) with these files:

index.php
test.php
and a second folder (/var/www/html/assets/ ) with these files:

php/phpmailer/...
php/mail.php
vendor/...
js/...
images/...
css/...

mi configuración de nginx es


    server {
      server_name example.gr www.example.gr;

      root /var/www/html/app/;
      index index.php index.html index.htm;

      location ^~ /php {
        root /var/www/html/assets/php;
        index mail.php mail.html;
        try_files $uri $uri/ /php/mail.php?q=$uri&$args;

          
        location ~* \.php(/|$) {
          fastcgi_pass unix:/run/php-fpm/www.sock;
          fastcgi_index mail.php;
          include /etc/nginx/fastcgi_params;
          fastcgi_param SCRIPT_FILENAME /var/www/html/assets/php$fastcgi_script_name;
          fastcgi_intercept_errors on;
        }
      }

      # location /php/ {
      #   alias /var/www/html/assets/php/;
      # }
      location /js/ {
        alias /var/www/html/assets/js/;
      }
      location /vendor/ {
        alias /var/www/html/assets/vendor/;
      }
      location /images/ {
        alias /var/www/html/assets/images/;
      }

      location / {
        #try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php?q=$uri&$args;
      }

      location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
      }
   }

La página www.example.grse carga correctamente con todas las imágenes, archivos js y css, pero el envío no funciona. Cuando accedo, aparece www.example.gr/php/mail.phpel error 404.

¿Cómo puedo hacer que funcione?

Respuesta1

Sus valores para rooty SCRIPT_FILENAMEdebajo del location ^~ /phpbloque son incorrectos.

El URI que se está procesando actualmente incluye el prefijo /php/y se combina con elroot valor para formar el nombre de la ruta (como se explicaaquí). Por lo tanto, no debe incluirlo phpen el rootvalor; de lo contrario, su nombre de ruta contendrá .../php/php/...algo que no funcionará.

Intentar:

location ^~ /php {
    root /var/www/html/assets;
    ...
    location ~* \.php(/|$) {
        ...
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

El valor de $document_rootes el mismo que el valor de la rootdeclaración que está actualmente dentro del alcance.

información relacionada