Nginx $ document_root $ fastcgi_script_name vs $ request_filename

16

Não consigo notar nenhuma diferença se no meu arquivo de configuração eu definir

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Ou:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

O que eles fazem respectivamente? Um dos dois é melhor que o outro?

Desde já, obrigado.

MultiformeIngegno
fonte

Respostas:

24

Aqui está o que a documentação diz:

$ request_filename

Essa variável é igual ao caminho para o arquivo para a solicitação atual, formada a partir de diretivas raiz ou alias e solicitação de URI;

$ document_root

Essa variável é igual ao valor da raiz da diretiva para a solicitação atual;

$ fastcgi_script_name

Essa variável é igual à solicitação do URI ou, se o URI for concluído com uma barra, a solicitação do URI mais o nome do arquivo de índice fornecido por fastcgi_index. É possível usar essa variável no lugar de SCRIPT_FILENAME e PATH_TRANSLATED, utilizados, em particular, para determinar o nome do script no PHP.

Como está escrito aqui, há pelo menos uma diferença ao usar fastcgi_index ou fastcgi_split_path_info . Talvez haja mais ... é disso que eu sei agora.

Exemplo

Você recebe a solicitação /info/e tem a seguinte configuração:

fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

SCRIPT_FILENAMEseria igual /home/www/scripts/php/info/index.php, mas usá- $request_filenamelo seria apenas /home/www/scripts/php/info/.

A configuração de também fastcgi_split_path_infoé importante. Consulte aqui para obter mais ajuda: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

SimonSimCity
fonte
Isso não parece ser verdade (não mais, pelo menos). Veja a resposta de Steely Wing.
Rimas Kudelis 5/09/19
@RimasKudelis Não utilizo isso há algum tempo, mas a documentação não mudou, então espero que ainda funcione - talvez você fastcgi_split_path_infoprecise de um ajuste. A resposta de Steely Wing parece ser extremamente baseada na experiência, não na documentação.
SimonSimCity
sim, e meu comentário também é baseado na experiência. Tentei ajustar fastcgi_split_path_infopara excluir meu prefixo de alias colocando-o fora das duas capturas, mas não pareceu ter nenhum efeito. Considerando passando $request_filenamecomo SCRIPT_FILENAMEfunciona como um encanto, independentemente de haver ou não um alias está envolvido.
Rimas Kudelis
Na verdade, não consigo entender por que a documentação do NginX sugere concatenar duas strings para formar SCRIPT_FILENAMEem primeiro lugar, quando $request_filenamecontém o nome do arquivo real resolvido, sem nenhum acréscimo acrescentado. O exemplo acima está realmente incorreto, pois $request_filenamede fato contém um nome de arquivo em vez de apenas um caminho, mesmo quando esse arquivo não foi solicitado explicitamente. Pelo menos essa é a minha conclusão de ontem.
Rimas Kudelis
7

TLDR

Eu recomendei o uso $request_filenamepara SCRIPT_FILENAME.


Se você estiver usando a rootdiretiva

$document_root$fastcgi_script_nameé igual a $request_filename.

Se você estiver usando a aliasdiretiva

$document_root$fastcgi_script_nameretornará o caminho errado, porque $fastcgi_script_nameé o caminho da URL, e não o caminho relacionado $document_root.

Exemplo

Se você tiver configuração

location /api/ {
    index  index.php index.html index.htm;
    alias /app/www/;
    location ~* "\.php$" {
        try_files      $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        # fastcgi_param  SCRIPT_FILENAME  $request_filename;
    }
}

Pedido /api/testing.php:

  • $document_root$fastcgi_script_name == /app/www//api/testing.php
  • $request_filename == /app/www/testing.php

Pedido /api/:

  • $document_root$fastcgi_script_name == /app/www//api/index.php
  • $request_filename == /app/www/index.php

E se você usar $request_filename, você deve definir o índice usando a indexdiretiva, fastcgi_indexnão funcionará.

Asa de aço
fonte
2

Eu acho que essas linhas foram retiradas do arquivo 'fastcgi_params' ..

Basicamente, você não está recebendo nenhum erro quando se trata, SCRIPT_FILENAMEporque já está definido quando você definiu sua diretiva raiz no seu arquivo vhost. Portanto, a menos que você o tenha definido explicitamente em seu arquivo vhost, fastcgi_paramo valor de SCRIPT_FILENAMEseria retirado da diretiva raiz. Mas UM PONTO IMPORTANTE AQUI. Existe outra variável que o nginx precisa para enviar as solicitações para o servidor php que é $fastcgi_script_namee você precisa defini-la bem para evitar URLs repetitivos e erros com os URLs que terminam com barra.

Conclusão :

Para que tudo funcione super bem, todos devem definir SCRIPT_FILENAMEexplicitamente no arquivo 'fastcgi_params' localizado na pasta / etc / nginx ou facilmente no vhost do site localizado na pasta sites disponíveis, incluindo a seguinte linha no bloco de localização php:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

ou incluído no arquivo 'fastcgi_params' como você escreveu acima, seja como for. Para obter mais informações sobre como conectar o ngnix ao PHP-FPM, vá para:

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/

Espero que ajude alguém no futuro, porque demorei muito tempo para descobrir isso.

Dr.SMS
fonte