Como servir arquivos php de uma pasta fora da pasta raiz da web no nginx

Como servir arquivos php de uma pasta fora da pasta raiz da web no nginx

Quando vou para o URL, www.example.grquero carregar um formulário para onde poderei enviá-lo www.example.gr/php/mail.php.

Minha estrutura de arquivos e pastas é assim

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/...

minha configuração nginx é


    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;
      }
   }

A página www.example.grcarrega com sucesso com todos os arquivos de imagens, js, css, mas o envio não funciona, quando vou www.example.gr/php/mail.phprecebo o erro 404.

Como posso fazer isso funcionar?

Responder1

Seus valores para roote SCRIPT_FILENAMEsob o location ^~ /phpbloco estão incorretos.

O URI atualmente sendo processado inclui o prefixo /php/e é combinado com o rootvalor para formar o nome do caminho (conforme explicadoaqui). Portanto, você não deve incluir phpno rootvalor, caso contrário seu nome de caminho conterá .../php/php/...o que não funcionará.

Tentar:

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

O valor de $document_rooté igual ao valor da rootinstrução que está atualmente no escopo.

informação relacionada