Como o try_files funciona com o fast_cgi?

1

Sou novato no Nginx e vi guias me dizendo que, se eu fizer isso:

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
}

(exemplo simplificado de link ).

Então, o que eu entendo é que, se um cliente pedir:

/uploads/myavatar.gif/ascript.php

E ascript.php não foi encontrado, o FastCGI começará a verificar o caminho para cima para ver se alguma parte realmente corresponde a um arquivo. Desta forma, assuma:

/uploads/myavatar.gif

existe porque alguém fez o upload, esse arquivo seria tratado, tendo a parte restante do $ uri no PATH_INFO. Então, '/script.php' seria o valor em PATH_INFO para um arquivo ¿gif? ¿Ou talvez um arquivo PHP com outra extensão?.

Portanto, a solução proposta para não cair em tal advertência era usar:

location ~ \.php$ {
    try_files $uri $uri/ =404;
    fastcgi_pass 127.0.0.1:9000;
}

O que eu entendo é que try_files verificará todas as especificações de arquivos alternativos e:

  • A última especificação deve existir ou 500 serão lançados.
  • A última especificação deve ser um código de erro precedido por um sinal de igualdade.
  • A última especificação deve ser outra @location declarada (o que poderia ser, por exemplo, um "_pass".

O que achei que entendi mas parece que não entendi corretamente é: Os arquivos são verificados em relação a uma diretiva root (ou seja, o arquivo try_files verifica o diretório root mais próximo e anexa cada especificação de arquivo). Então, o que eu pensei é assim:

root /var/nginx/www;
#assume this directory exists
location ~ \.php$ {
    try_files $uri $uri/ =404;
    fastcgi_pass 127.0.0.1:9000;
}

#each uri would be tested like root$uri, root$uri/, or fail with =404

Mas se essa é a lógica, que sob essa nova luz eu não vejo como é certo, então:

  • Um .php seria testado quanto à existência de uma determinada raiz.
  • Se não for arquivo nem diretório, FAIL com 404.
  • Se não falhar, passe o mesmo caminho para o fastcgi.

A minha pergunta é :

  • Como o try_files funciona ao avaliar todas as alternativas de arquivos E há um proxy_pass ou um fast_cgi? Parece que tenho a impressão errada sobre como funcionou.
  • Quem tem precedência entre ter uma diretiva root e uma diretiva fastcgi_pass , em relação à verificação de arquivo? (também estou interessado na possibilidade de ter proxy_pass para projetos baseados em python que montam-cada- um servidor local como gunicorn ).
por Luis Masuelli 01.08.2014 / 17:46

1 resposta

1

try_files é um verificador de existência de arquivo simples. Ele simplesmente verifica se o arquivo ( $uri ) ou diretório ( $uri/ ) existe.

Se nenhum desses existir, ele retornará o erro 404.

Se o arquivo existir, a execução continuará para a próxima linha, ou seja, fastcgi_pass ou proxy_pass ou qualquer outra coisa que tenha sido configurada.

Portanto, o comportamento de try_files é independente de fastcgi_pass ou proxy_pass .

try_files sempre usa a diretiva root para verificar a existência do arquivo.

Em seguida, a solução para o problema original de possíveis explorações via arquivos .gif é incluir essa diretiva no bloco de localização do PHP:

fastcgi_split_path_info ^(.+\.php)(/.+)$;

Você também precisa definir cgi.fix_pathinfo para false em php.ini.

Desta forma, o PHP obtém o nome correto do arquivo PHP como o script a ser executado.

    
por 02.08.2014 / 05:03

Tags