Nginx try_files pegadinha

1

Ok - eu tenho usado essa regra por um tempo

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    alias /usr/local/image/$1;
    error_page 404 /handler.php;
}

onde, se o arquivo de imagem existir, ele será exibido - se o arquivo não existir, uma página de erro 404 customizada chamada /handler.php funcionará para entregar as mercadorias. se a imagem estivesse inalterada, retornaria um 304 - novas imagens retornavam um 200. Quase perfeito.

O problema é que retornar um 404 com a imagem não é a coisa apropriada a fazer - eu deveria aceitar o pedido, determinar se o arquivo existe e se não executar o manipulador e retornar a imagem - e não mostrar um 404.

Eu tentei substituir error_page por try_files, mas não estou obtendo o resultado desejado:

 location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
     alias /usr/local/image/$1;
     try_files $uri $uri/ /handler.php;
 }

Nada parece coincidir em try_files, então todas as solicitações passam para handler.php. Eu entendo que o alias é um padrão de correspondência especial, mas se eu tentar entrar em

try_files "" /handler.php;

O que funciona, mas o "" retorna o tipo de conteúdo incorreto (Content-Type: · application / octet-stream) enquanto handler.php retorna o correto (Content-Type: · image / jpeg)

claro, eu poderia adicionar "default_type image / jpeg;" para forçar o padrão, mas corro o risco de retornar um tipo de conteúdo jpeg quando a imagem real pode ser gif ou png.

Estou executando o debian 6 - nginx-1.0.6-1 ~ dotdeb.2

Alguma idéia de como fazer isso funcionar?

    
por jimg 04.10.2011 / 07:38

1 resposta

5

Primeiro de tudo, você pode forçar o Nginx a retornar o código de status do seu script ao usar error_page :

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    alias /usr/local/image/$1;
    error_page 404 = /handler.php;
}

Esse sinal de igual diz ao Nginx para retornar o código de status de handler.php em vez de 404 .

A partir de try_files , experimente esta configuração:

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    root /usr/local/image;
    try_files /$1 /handler.php;
}
    
por 04.10.2011 / 10:50

Tags