O Nginx 'if_modified_since' funciona apenas em recursos estáticos?

6

Não consigo encontrar documentação suficiente . Eu tenho um aplicativo que gera algumas respostas dinâmicas, mas ainda pode se beneficiar do cabeçalho Last-Modified - então eu o envio.

No entanto, ativar if_modified_since (definido como before , por link ) não parece ter qualquer efeito sobre recursos não estáticos. Por exemplo, aplicativos php, python.

É porque o Nginx não está apenas olhando para minha resposta Last-Modified header? Porque eu posso ver que eles parecem estar definidos corretamente, como abaixo:

> GET /3.0/view.json?id=2 HTTP/1.1
> Host: xxxxxxxxxxxxx
> Accept: */*
> If-Modified-Since: Sat, 02 May 2015 19:43:02 GMT
>
< HTTP/1.1 200 OK
* Server nginx/1.4.7 is not blacklisted
< Server: nginx/1.4.7
< Date: Fri, 01 May 2015 19:56:05 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Fri, 01 May 2015 19:56:05 GMT

Ou há algo maior que eu estou negligenciando? Apenas curioso como if_modified_since é implementado, comparado a onde eu estou definindo minhas expectativas. Presumi que seria apenas olhar para os cabeçalhos de resposta e ultrapassar o status conforme necessário. Estou errado?

    
por anonymous coward 01.05.2015 / 22:20

2 respostas

4

O envio de Last-Modified cabeçalhos às suas respostas do aplicativo é um começo, mas parece que você não processa If-Modified-Since corretamente nas solicitações recebidas porque seu aplicativo deve responder 304 Not Modified e não 200 OK . Alterar a diretiva no nginx impacta somente as solicitações atendidas diretamente pelo nginx, ou seja, os recursos estáticos, a menos que você os configure como um cache de proxy reverso. Nesse caso, você pode enviar respostas obsoletas em relação a esse valor de cabeçalho, pois o conteúdo será armazenado em cache por um período de tempo sem afetar seu aplicativo. Ativar <X>_cache_revalidate usará o cabeçalho If-Modified-Since para revalidar o conteúdo do cache entre o cache do nginx e seu aplicativo depois que ele expirar (onde <X> = proxy / fastcgi / scgi / uwsgi)

    
por 02.05.2015 / 08:04
0

Como você não mencionou nada sobre sua configuração de cache no Nginx, presumo que você não definiu um cache, e isso explicaria porque o seu cabeçalho If-Modified-Since não tem efeito para respostas dinâmicas.

Quando se trata de recursos estáticos, o Nginx tem uma maneira muito fácil de determinar como lidar com If-Modified-Since : ele compara a hora no campo com a hora em que o arquivo foi modificado pela última vez. Não há problema aí.

Quando você quiser que o Nginx faça o mesmo com as respostas geradas dinamicamente, não há nada para comparar com ele, a menos que você ative o cache. Por padrão, o Nginx não lembra as respostas que ele atendeu. Quando você ativa o cache, o Nginx tem uma maneira de comparar uma solicitação recebida com uma resposta dada anteriormente e, portanto, tem uma maneira de usar If-Modified-Since .

Eu encontrei este artigo realmente útil para aprender os detalhes mais precisos da configuração de um cache Nginx.

    
por 02.05.2015 / 01:58