Eu olhei para a documentação do nginx e ainda me confunde totalmente.
Como try_files
funciona? Veja o que diz a documentação:
try_files
sintaxe: try_files path1 [path2] uri
padrão: nenhum
contexto: servidor, local
disponibilidade: 0.7.27
Verifica a existência de arquivos em ordem e retorna o primeiro arquivo encontrado. Uma barra final indica um diretório - $uri /. Caso nenhum arquivo seja 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 são preservados automaticamente se o fallback não for um local nomeado. Se você precisar de argumentos preservados, deverá fazê-lo explicitamente:
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.html
e se ele falhar, /path/app/index.php
como eu escreveria isso? Se eu escrevi:
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.php
então /path/app/cache/urlname/index.html
? Se ignorarmos tudo depois try_files
, é possível try_files
verificar a pasta de cache? Tenho tentado e falhei.
try_files tenta o caminho literal que você especifica em relação à diretiva raiz definida e define o ponteiro de arquivo interno. Se você usar, por exemplo ,
try_files /app/cache/ $uri @fallback;
comindex index.php index.html;
, ele testará os caminhos nesta ordem:$document_root/app/cache/index.php
$document_root/app/cache/index.html
$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 deve existir .Você deve observar que o próprio try_files não emitirá um redirecionamento interno para nada além do último parâmetro. Isso significa que você não pode fazer o seguinte:
try_files $uri /cache.php @fallback;
pois isso fará com que o nginx defina o ponteiro do arquivo interno para $document_root/cache.php e o sirva, mas como nenhum redirecionamento interno ocorre, os locais não são reavaliados e, como tal, serão serviu como texto simples. (A razão pela qual funciona com arquivos PHP como índice é que a diretiva index emitirá um redirecionamento interno)Aqui está outro uso conveniente de try_files, como redirecionamentos incondicionais para locais nomeados. Os locais nomeados estão efetivamente atuando como sub-rotinas, economizando a duplicação de código. Quando o primeiro argumento para try_files é
_
o redirecionamento de fallback sempre é usado (assumindo que_
não é um nome de arquivo existente). Porque o nginx precisa de umagoto
declaração, mas não tem uma.