nginx, php-fpm e múltiplas raízes - como tentar corretamente os arquivos?

2

Eu tenho um contexto de servidor que está enraizado em um aplicativo de login. O aplicativo de login manipula, bem, logins e, em seguida, retorna um redirecionamento para "/ app" no mesmo servidor, se um login for bem-sucedido. O aplicativo está enraizado em outro lugar, que é tratado pelo bloco de localização mostrado aqui:

location ^~ /app {
        alias /usr/share/nginx/www/website.com/content/public;
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_pass unix:/tmp/php5-fpm.sock;
                include fastcgi_params;
        }
}

Isso funciona muito bem, no entanto, o $ uri sendo passado para o PHP ainda contém /app , embora eu esteja usando alias em vez de root. Por causa disso, a diretiva try_files falha em 404 , a menos que eu vincule app -> ./ em /usr/share/nginx/www/website.com/content/public .

É obviamente bobo ter esse link lá, e se esse link for perdido, um site bam dead sem uma causa óbvia.

A próxima coisa que eu tentei ...

Foi remover completamente a diretiva try_files . Isso me permitiu% rm o link app na minha pasta /public , e o PHP não teve problemas para localizar o arquivo e executá-lo. Eu usei isso para despejar meu $_SERVER global do PHP e descobri que "SCRIPT_FILENAME" => "/usr/share/nginx/www/website.com/content/public/index.php" quando o URI do navegador é /app .

Isto é exatamente certo . Baseado no meu fastcgi_params abaixo, isso me levou a acreditar que try_files $request_filename =404; deveria funcionar, mas sem dados. O nginx ainda não encontra o arquivo e retorna 404.

Então, por enquanto, funcionará somente sem a diretiva try_files . O PHP encontra o arquivo, enquanto o try_files não. Eu entendo isso pode ser um risco de segurança do PHP. Alguém pode indicar como seguir em frente? Os logs nginx não contêm nada relacionado à tentativa try_files com falha, até onde eu posso ver.

fastcgi_aparams

fastcgi_param   QUERY_STRING        $query_string;
fastcgi_param   REQUEST_METHOD      $request_method;
fastcgi_param   CONTENT_TYPE        $content_type;
fastcgi_param   CONTENT_LENGTH      $content_length;

fastcgi_param   SCRIPT_FILENAME     $request_filename;
fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
fastcgi_param   REQUEST_URI     $request_uri;
fastcgi_param   DOCUMENT_URI        $document_uri;
fastcgi_param   DOCUMENT_ROOT       $document_root;
fastcgi_param   SERVER_PROTOCOL     $server_protocol;

fastcgi_param   GATEWAY_INTERFACE   CGI/1.1;
fastcgi_param   SERVER_SOFTWARE     nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR     $remote_addr;
fastcgi_param   REMOTE_PORT     $remote_port;
fastcgi_param   SERVER_ADDR     $server_addr;
fastcgi_param   SERVER_PORT     $server_port;
fastcgi_param   SERVER_NAME     $server_name;

fastcgi_param   HTTPS           $server_https;
    
por Carson C. 09.01.2012 / 21:15

2 respostas

2

Para que funcione, fastcgi_param SCRIPT_FILENAME $request_filename precisa ser copiado no bloco de localização, assim:

location ^~ /app {
        alias /usr/share/nginx/www/website.com/content/public;
        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;

                fastcgi_pass unix:/tmp/php5-fpm.sock;
                try_files $uri =404; 
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                fastcgi_split_path_info         ^(.+\.php)(/.+)$;
                fastcgi_index               index.php;
        }
}

Isso ocorre porque, nos arquivos de configuração incluídos, a dose $ request_filename não reflete o novo alias, devido à forma como o nginx herda os valores de configuração entre os níveis.

    
por 26.02.2013 / 14:58
0

Verifique seu fastcgi_params. Muito provavelmente, o seu SCRIPT_FILENAME é definido como $ document_root $ fastcgi_script_name, que explicitamente diz para não considerar alias (a parte $ document_root é a parte explícita)

Se você quiser usar o alias com o PHP, você provavelmente deve definir o SCRIPT_FILENAME como $ request_filename, que leva o alias em consideração.

    
por 10.01.2012 / 12:17

Tags