Como o try_files funciona?


72

Eu olhei para a documentação do nginx e ela ainda me confunde totalmente.

Como try_filesfunciona? Aqui está o que a documentação diz:

De NginxHttpCoreModule

try_files

sintaxe: try_files caminho1 [caminho2] uri

padrão: nenhum

contexto: servidor, localização

disponibilidade: 0.7.27

Verifica a existência de arquivos em ordem e retorna o primeiro arquivo encontrado. Uma barra à direita indica um diretório - $ uri /. No caso de nenhum arquivo ser encontrado, um redirecionamento interno para o último parâmetro é chamado. O último parâmetro é o URI de fallback e deve existir, caso contrário, um erro interno será gerado. Ao contrário da reescrita, $ args não serão preservados automaticamente se o fallback não for um local nomeado. Se você precisar de args preservados, faça isso explicitamente:

Eu não entendo como ele verifica os caminhos e se eu não quiser um erro interno, mas ele retomar o restante do caminho em um esforço para encontrar outro arquivo?

Se eu quiser tentar um arquivo em cache /path/app/cache/url/index.htmle se ele não tentar, /path/app/index.phpcomo eu escreveria isso? Se eu escrevesse:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

Eu tenho index index.php index.html index.htm;. Quando eu visitar /urlname, ele tentará verificar /path/app/cache/urlname/index.phpentão /path/app/cache/urlname/index.html? Se ignorarmos tudo depois, try_filesé possível try_filesverificar a pasta de cache? Eu tenho tentado e falhei.

Respostas:


64

try_files tenta o caminho literal especificado em relação à diretiva raiz definida e define o ponteiro interno do arquivo. Se você usar, por exemplo, try_files /app/cache/ $uri @fallback;com index index.php index.html;, ele testará os caminhos nesta ordem:

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

antes de finalmente redirecionar internamente para o local nomeado @fallback. Você também pode usar um arquivo ou um código de status ( =404) como seu último parâmetro, mas se estiver usando um arquivo, ele deverá existir .

Você deve observar que o próprio try_files não emitirá um redirecionamento interno para nada além do último parâmetro. Ou seja, você não pode fazer o seguinte: try_files $uri /cache.php @fallback;como isso fará com que o nginx defina o ponteiro do arquivo interno como $ document_root / cache.php e o atenda, mas como nenhum redirecionamento interno ocorre, os locais não são reavaliados e, como tal, será servido como texto sem formatação. (A razão ele funciona com arquivos PHP como o índice é que a directiva índice irá emitir um redirecionamento interno)


2
Isso é muito mais claro. Obrigado. Estou um pouco inseguro de como o local nomeado funciona. Se @fallback tiver linhas para o fastcgi php que serviriam como um arquivo php em vez de texto? O fallback é usado quando tudo antes de falhar?

2
Um local nomeado é funcionalmente idêntico a um local normal, exceto que só pode ser acessado por mecanismos internos, como error_page e try_files. O fallback em try_files é usado apenas quando nenhum dos caminhos especificados resulta em um arquivo válido. Você ainda precisa de um local para capturar \ .php $ URIs, caso contrário o try_files será acionado em $ uri se o arquivo existir e servirá como texto sem formatação.
Martin Fjordvald 11/11

Obrigado por esta resposta .. Ainda tenho uma pergunta aqui: o try_files é executado imediatamente ou o local aninhado será tentado antes?
Stphane

@ Stphane Você está se mudando para águas turvas aqui. A herança no nginx é complexa, confusa e totalmente inconsistente. Eu tive que revisar minhas anotações antigas apenas para lembrar disso, sem garantias, mas parece que para try_files, especificamente ao lidar apenas com locais aninhados, não será executado se o local interno corresponder. Eu recomendo testá-lo, no entanto.
Martin Fjordvald 11/01

5

Aqui está outro uso conveniente de try_files, como redirecionamentos incondicionais para locais nomeados. Os locais nomeados estão atuando efetivamente como sub-rotinas, economizando duplicação de código. Quando o primeiro argumento para try_files é "_", o redirecionamento de fallback é sempre utilizado.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.