nginx serve imagem via script php

1

Eu não sou muito experiente com o nginx, então estou um pouco perdido com o vhost configurado. Basicamente o meu aplicativo, ao servir algumas imagens serve-os via script PHP isso é muito simples com o apache: procure por imagem física - > se não for encontrado, empurre tudo para index.php com a string de requisição como params. Não, eu estou tentando este aplicativo no nginx e tudo funciona, exceto a imagem servindo via script (acabei de receber um 404). Aqui está o meu vhost para o nginx:

server {
    listen 80;

    server_name ~^(www\.)?(?<sname>.+?).subdomain.domain.com$;
    root /var/www/$sname/current/public;
    index index.html index.htm index.php;

    location / {
            try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
            add_header        Cache-Control public;
            add_header        Cache-Control must-revalidate;
            expires           7d;
    }

    location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            include fastcgi_params;
            fastcgi_index index.php;
    }

    location ~ /\.ht {
            deny all;
    }

}

Parece que está procurando apenas a imagem em um local físico, isso funciona para imagens físicas reais, mas não para imagens dinâmicas, onde elas são servidas por meio de um script. Qualquer ajuda ou orientação é muito apreciada.

Update: ok, então eu descobri que se eu remover o .jpg do local de controle de cache, ele funciona, mas eu ainda quero definir cabeçalhos de cache para essas solicitações de imagens dinâmicas, então como faço isso rodar via php e depois definir o cabeçalho do cache depois disso?

    
por Auris 12.07.2017 / 12:08

2 respostas

1

Você pode usar esse bloco location para suas imagens:

location ~* \.(jpg|jpeg|gif|png|bmp)$ {
    try_files $uri $uri/ /index.php$is_args$args;

    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;
}

Pode ser necessário modificar /index.php?$is_args$args parte na linha try_files para que você obtenha os parâmetros corretos para o seu script, já que sua pergunta inicial não mostrou claramente quais são os parâmetros desejados.

Em seguida, para o restante das opções de cache, use este location block:

location ~* \.(ico|pdf|flv|swf|exe|html|htm|txt|css|js)$ {
    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;
}

Também adicionei o $ às sequências de correspondência regex, para que apenas as solicitações que terminam com a extensão sejam processadas por esse bloco. Por exemplo, com sua configuração inicial, um URL https://example.com/path/image.jpg75783 seria processado pelo seu bloco location , onde você especifica suas diretivas de cache.

Outra alternativa é definir seus cabeçalhos de cache de imagem em seu script PHP.

    
por 12.07.2017 / 15:44
0

Para adicionar cabeçalhos e validade a todos os URIs, você precisa colocar as instruções no bloco server . Nesse caso, eles são herdados por cada bloco de localização. Por exemplo:

server {
    ...

    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        ...
    }

    location ~ /\.ht {
        deny all;
    }
}
    
por 12.07.2017 / 13:14