Isso é um pouco difícil de descrever. Eu basicamente quero que o nginx responda com o autoindex em vez do arquivo index.html definido, se houver ?listing=true
no URI.
Já tentei ter isso dentro do meu location / {...}
, para que ele não tenha nenhum índice para mostrar:
if ($arg_listing = "true") {
index =404;
add_header Content-Type application/json;
return 200;
}
Mas isso fez com que o serviço nginx não iniciasse, porque aparentemente você não pode ter index
or autoindex
dentro de um bloco if. Eu sei que o bloco if funciona pelo menos, porque o 200 é retornado se eu remover o index
.
Não tenho muita experiência em usar nginx, então não tenho ideia do que fazer. Aqui está a /etc/nginx/sites-enabled/default
configuração completa: https://pastebin.com/iRiMpCk9
Edição: Alterei o link do Pastebin, porque antes estava errado.
Na verdade, uma
if
diretiva nginx, quando usada emlocation
contexto, tem muito pouco em comum com construções semelhantes de linguagens de programação imperativas. Uma das melhores explicações de como essa diretiva realmente funciona foi fornecida por Yichun Zhang, o autor do famoso lua-nginx-module e do pacote OpenResty . Na verdade, cadaif
diretiva cria implicitamente um local aninhado que tenta herdar todas as declarações do local pai. Existem, no entanto, certas limitações sobre quais diretivas podem ser usadas no chamado contexto "if
inlocation
" (se puderem, será explicitamente declarado na documentação), e você acabou de encontrar uma delas (aautoindex
diretiva não pode ser usada neste contexto). A solução mais comum para tais situações é usar variáveis como argumentos para essas diretivas.Infelizmente, nem todas as diretivas nginx permitem o uso de variáveis como seus parâmetros (como regra, se isso for possível, é explicitamente declarado na documentação da diretiva correspondente). Em particular, a
autoindex
diretiva não suporta especificar seu parâmetro como uma variável cujo valor pode seron
ouoff
. Portanto, de fato, a solução envolvendo o uso de dois locais nomeados separados com configurações diferentes para esta diretiva é provavelmente a única opção possível. No entanto, como eu já disse , você não pode pular para o local nomeado viarewrite
diretiva. Em vez disso, você pode fazer isso viatry_files
diretiva, conforme descrito aqui :Mas tenha em mente que, para que
autoindex
a diretiva entre em vigor, não deve haver um arquivo de índice (index.html
por padrão) no diretório do servidor web solicitado.tente isto: