Como eu sirvo todos os caminhos em um SUBDIRECTORY para um único arquivo PHP usando nginx?

1

Eu tenho a seguinte estrutura

/var/www/lsl/generalmedia
    subcontent1/
         picture.jpg
    subcontent2/
         subsub1/
             picture.jpg
         subsub2/
    index.php

Acessível via website.com/lsl/generalmedia

Eu gostaria de fazer os subdiretórios usarem o mesmo arquivo index.php, mas servir arquivos normalmente. Exemplos:

website.com/lsl/generalmedia/subcontent1 precisa chamar lsl/generalmedia/index.php

website.com/lsl/generalmedia/subcontent1/picture.jpg deve abrir a foto no seu navegador.

Eu tentei o seguinte, mas estou proibindo 403 sempre que vou para um subdiretório:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/;
    index index.php;
    server_name _;

    location /lsl/generalmedia/ {
            try_files $uri $uri/ @nested;
            location ~ \.php$ {
                    include snippets/fastcgi-php.conf;
                    fastcgi_param SCRIPT_FILENAME /var/www/lsl/generalmedia/index.php;
                    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
            }
    }

    location @nested{
            rewrite /lsl/generalmedia/(.*)$ /lsl/generalmedia/index.php?/$1 last;
    }


    location / {
            try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }

}
    
por user2145184 18.10.2018 / 16:11

1 resposta

2

O termo $uri/ na instrução try_files faz com que o Nginx teste a existência de um diretório. Consulte este documento para obter detalhes.

Como subcontent1 é um diretório, o Nginx o processa de acordo com a diretiva index . A resposta 403 é porque não há nenhum arquivo index.php dentro desse subdiretório.

Remova esse termo, por exemplo:

location /lsl/generalmedia/ {
    try_files $uri @nested;
}

Além disso, o bloco de localização aninhada nunca é visitado, pois qualquer URI que termine com .php é atualmente processado pelo bloco location ~ \.php$ no final da sua configuração.

Se a reescrita específica no bloco @nested não for necessária, o arquivo PHP padrão pode ser especificado na mesma instrução. Por exemplo:

location /lsl/generalmedia/ {
    try_files $uri /lsl/generalmedia/index.php?$args;
}
    
por 18.10.2018 / 17:01

Tags